📄 sockfilt.c
字号:
if(sockfd != CURL_SOCKET_BAD) { logmsg("====> Client forcibly disconnected"); sclose(sockfd); *sockfdp = CURL_SOCKET_BAD; if(*mode == PASSIVE_CONNECT) *mode = PASSIVE_LISTEN; else *mode = ACTIVE_DISCONNECT; } else logmsg("attempt to close already dead connection"); return TRUE; } } else if(-1 == nread_stdin) { logmsg("read %d from stdin, exiting", nread_stdin); return FALSE; } } if((sockfd != CURL_SOCKET_BAD) && (FD_ISSET(sockfd, &fds_read)) ) { if(*mode == PASSIVE_LISTEN) { /* there's no stream set up yet, this is an indication that there's a client connecting. */ sockfd = accept(sockfd, NULL, NULL); if(CURL_SOCKET_BAD == sockfd) logmsg("accept() failed"); else { logmsg("====> Client connect"); write(fileno(stdout), "CNCT\n", 5); *sockfdp = sockfd; /* store the new socket */ *mode = PASSIVE_CONNECT; /* we have connected */ } return TRUE; } /* read from socket, pass on data to stdout */ nread_socket = sread(sockfd, buffer, sizeof(buffer)); if(nread_socket <= 0) { logmsg("====> Client disconnect"); write(fileno(stdout), "DISC\n", 5); sclose(sockfd); *sockfdp = CURL_SOCKET_BAD; if(*mode == PASSIVE_CONNECT) *mode = PASSIVE_LISTEN; else *mode = ACTIVE_DISCONNECT; return TRUE; } snprintf(data, sizeof(data), "DATA\n%04x\n", nread_socket); write(fileno(stdout), data, 10); write(fileno(stdout), buffer, nread_socket); logmsg("< %d bytes data, client => server", nread_socket); lograw(buffer, nread_socket); } return TRUE;}static curl_socket_t sockdaemon(curl_socket_t sock, unsigned short *listenport){ /* passive daemon style */ struct sockaddr_in me;#ifdef ENABLE_IPV6 struct sockaddr_in6 me6;#endif /* ENABLE_IPV6 */ int flag = 1; int rc; int maxretr = 12; int delay= 10; rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&flag, sizeof(flag)); while ((rc < 0) && maxretr) { maxretr--; go_sleep(delay); delay *= 2; /* double the sleep for next attempt */ rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&flag, sizeof(flag)); } if (rc < 0) { perror("setsockopt(SO_REUSEADDR)"); }#ifdef ENABLE_IPV6 if(!use_ipv6) {#endif me.sin_family = AF_INET; me.sin_addr.s_addr = INADDR_ANY; me.sin_port = htons(*listenport); rc = bind(sock, (struct sockaddr *) &me, sizeof(me));#ifdef ENABLE_IPV6 } else { memset(&me6, 0, sizeof(struct sockaddr_in6)); me6.sin6_family = AF_INET6; me6.sin6_addr = in6addr_any; me6.sin6_port = htons(*listenport); rc = bind(sock, (struct sockaddr *) &me6, sizeof(me6)); }#endif /* ENABLE_IPV6 */ if(rc < 0) { perror("binding stream socket"); logmsg("Error binding socket"); return CURL_SOCKET_BAD; } if(!*listenport) { /* The system picked a port number, now figure out which port we actually got */ /* we succeeded to bind */ struct sockaddr_in add; socklen_t socksize = sizeof(add); if(getsockname(sock, (struct sockaddr *) &add, &socksize)<0) { logmsg("getsockname() failed with error: %d", SOCKERRNO); return CURL_SOCKET_BAD; } *listenport = ntohs(add.sin_port); } /* start accepting connections */ rc = listen(sock, 4); if(0 != rc) { logmsg("listen() failed with error: %d", SOCKERRNO); sclose(sock); return CURL_SOCKET_BAD; } return sock;}static curl_socket_t mksock(bool ipv6){ curl_socket_t sock;#ifdef ENABLE_IPV6 if(!ipv6)#else (void)ipv6;#endif sock = socket(AF_INET, SOCK_STREAM, 0);#ifdef ENABLE_IPV6 else sock = socket(AF_INET6, SOCK_STREAM, 0);#endif if (CURL_SOCKET_BAD == sock) { perror("opening stream socket"); logmsg("Error opening socket"); } return sock;}int main(int argc, char *argv[]){ struct sockaddr_in me;#ifdef ENABLE_IPV6 struct sockaddr_in6 me6;#endif /* ENABLE_IPV6 */ curl_socket_t sock; curl_socket_t msgsock; FILE *pidfile; char *pidname= (char *)".sockfilt.pid"; int rc; int error; int arg=1; enum sockmode mode = PASSIVE_LISTEN; /* default */ const char *addr = NULL; while(argc>arg) { if(!strcmp("--version", argv[arg])) { printf("sockfilt IPv4%s\n",#ifdef ENABLE_IPV6 "/IPv6"#else ""#endif ); return 0; } else if(!strcmp("--pidfile", argv[arg])) { arg++; if(argc>arg) pidname = argv[arg++]; } else if(!strcmp("--logfile", argv[arg])) { arg++; if(argc>arg) serverlogfile = argv[arg++]; } else if(!strcmp("--ipv6", argv[arg])) {#ifdef ENABLE_IPV6 use_ipv6=TRUE;#endif arg++; } else if(!strcmp("--ipv4", argv[arg])) { /* for completeness, we support this option as well */ use_ipv6=FALSE; arg++; } else if(!strcmp("--port", argv[arg])) { arg++; if(argc>arg) { port = (unsigned short)atoi(argv[arg]); arg++; } } else if(!strcmp("--connect", argv[arg])) { /* Asked to actively connect to the specified local port instead of doing a passive server-style listening. */ arg++; if(argc>arg) { connectport = (unsigned short)atoi(argv[arg]); arg++; } } else if(!strcmp("--addr", argv[arg])) { /* Set an IP address to use with --connect; otherwise use localhost */ arg++; if(argc>arg) { addr = argv[arg]; arg++; } } else { puts("Usage: sockfilt [option]\n" " --version\n" " --logfile [file]\n" " --pidfile [file]\n" " --ipv4\n" " --ipv6\n" " --port [port]\n" " --connect [port]\n" " --addr [address]"); return 0; } }#ifdef WIN32 win32_init(); atexit(win32_cleanup);#else#ifdef SIGPIPE#ifdef HAVE_SIGNAL signal(SIGPIPE, sigpipe_handler);#endif#ifdef HAVE_SIGINTERRUPT siginterrupt(SIGPIPE, 1);#endif#endif#endif sock = mksock(use_ipv6); if (CURL_SOCKET_BAD == sock) { logmsg("Error opening socket: %d", SOCKERRNO); return 1; } if(connectport) { /* Active mode, we should connect to the given port number */ mode = ACTIVE;#ifdef ENABLE_IPV6 if(!use_ipv6) {#endif memset(&me, 0, sizeof(me)); me.sin_family = AF_INET; me.sin_port = htons(connectport); me.sin_addr.s_addr = INADDR_ANY; if (!addr) addr = "127.0.0.1"; Curl_inet_pton(AF_INET, addr, &me.sin_addr); rc = connect(sock, (struct sockaddr *) &me, sizeof(me));#ifdef ENABLE_IPV6 } else { memset(&me6, 0, sizeof(me6)); me6.sin6_family = AF_INET6; me6.sin6_port = htons(connectport); if (!addr) addr = "::1"; Curl_inet_pton(AF_INET6, addr, &me6.sin6_addr); rc = connect(sock, (struct sockaddr *) &me6, sizeof(me6)); }#endif /* ENABLE_IPV6 */ if(rc) { perror("connecting stream socket"); logmsg("Error connecting to port %d", port); sclose(sock); return 1; } logmsg("====> Client connect"); msgsock = sock; /* use this as stream */ } else { /* passive daemon style */ sock = sockdaemon(sock, &port); if(CURL_SOCKET_BAD == sock) return 1; msgsock = CURL_SOCKET_BAD; /* no stream socket yet */ } logmsg("Running IPv%d version", (use_ipv6?6:4)); if(connectport) logmsg("Connected to port %d", connectport); else logmsg("Listening on port %d", port); pidfile = fopen(pidname, "w"); if(pidfile) { int pid = (int)getpid(); fprintf(pidfile, "%d\n", pid); fclose(pidfile); logmsg("Wrote pid %d to %s", pid, pidname); } else { error = ERRNO; logmsg("fopen() failed with error: %d %s", error, strerror(error)); logmsg("Error opening file: %s", pidname); logmsg("Couldn't write pid file"); sclose(sock); return 1; } while(juggle(&msgsock, sock, &mode)); sclose(sock); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -