⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockfilt.c

📁 THIS IS HTTP CURL Example
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -