connect.c
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:2k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <memory.h>
  5. #include <sys/types.h>
  6. #include <sys/time.h>
  7. #include <sys/socket.h>
  8. #include <sys/resource.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <netdb.h>
  12. struct sockaddr_in ssin;
  13. int TryConnect(int i) {
  14.     struct linger sl = { 0, 0 };
  15.     fd_set fds;
  16.     int sd;
  17.     if ((sd = socket(AF_INET, SOCK_STREAM, 0))                            < 0) return -1;
  18.     if (connect(sd, &ssin, sizeof(struct sockaddr_in))                    < 0) return -1;
  19.     FD_ZERO(&fds);
  20.     FD_SET(sd, &fds);
  21.     
  22.     if (select(sd+1, &fds, NULL, NULL, NULL)                              < 0) return -1;
  23.     close(sd);
  24.     fprintf(stderr, "%d ", i);
  25.     fflush(stderr);
  26.     return 0;
  27. }
  28. int main(int argc, char **argv) {
  29.     u_long addr = inet_addr("127.0.0.1");
  30.     char *ss = getenv("SOCKS_SERVER");
  31.     struct timeval ds, de;
  32.     struct rusage rs, re;
  33.     struct hostent *hp;
  34.     int ntrys = 100, i;
  35.     if (argc > 1) ntrys = atoi(argv[1]);
  36.     if (ss)
  37. if ((hp = gethostbyname(ss)) != NULL) memcpy(&addr, (char *)hp->h_addr_list[0], 4);
  38. else if (inet_addr(ss) != -1) addr = inet_addr(ss);
  39.     memset((char *)&ssin, 0, sizeof(struct sockaddr_in));
  40.     ssin.sin_family      = AF_INET;
  41.     ssin.sin_port        = htons(1080);
  42.     ssin.sin_addr.s_addr = addr;
  43.     getrusage(RUSAGE_SELF, &rs);
  44.     gettimeofday(&ds, NULL);
  45.     
  46.     for (i = 0; i < ntrys; i++) if (TryConnect(i)) break;
  47.     getrusage(RUSAGE_SELF, &re);
  48.     gettimeofday(&de, NULL);
  49.     re.ru_utime.tv_sec  -= rs.ru_utime.tv_sec;
  50.     re.ru_utime.tv_usec -= rs.ru_utime.tv_usec;
  51.     if (re.ru_utime.tv_usec < 0) {
  52. re.ru_utime.tv_sec  -= 1;
  53. re.ru_utime.tv_usec += 1000000;
  54.     }
  55.     
  56.     re.ru_stime.tv_sec  -= rs.ru_stime.tv_sec;
  57.     re.ru_stime.tv_usec -= rs.ru_stime.tv_usec;
  58.     if (re.ru_stime.tv_usec < 0) {
  59. re.ru_stime.tv_sec  -= 1;
  60. re.ru_stime.tv_usec += 1000000;
  61.     }
  62.     de.tv_sec  -= ds.tv_sec;
  63.     de.tv_usec -= ds.tv_usec;
  64.     if (de.tv_usec < 0) {
  65. de.tv_sec  -= 1;
  66. de.tv_usec += 1000000;
  67.     }
  68.     fprintf(stderr, "n%d connects in %d.%du %d.%ds %d.%dtn", i,
  69.     re.ru_utime.tv_sec, re.ru_utime.tv_usec,
  70.     re.ru_stime.tv_sec, re.ru_stime.tv_usec,
  71.     de.tv_sec,          de.tv_usec);
  72.     exit(0);
  73. }