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

代理服务器

开发平台:

Unix_Linux

  1. /* This code was written by Carson Gaspar, I've put it here just in case */
  2. /* anyone else has problems with non-blocking code...                    */
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <fcntl.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <netdb.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <errno.h>
  12. #include <sys/time.h>
  13. #include <string.h>
  14. int main(int argc, char **argv)
  15. {
  16.   int mysock,status,numfds;
  17.   short port;
  18.   struct hostent *hent;
  19.   struct sockaddr_in mysa;
  20.   fd_set rfds,wfds,efds;
  21.   struct timeval mytv;
  22.   if (argc != 3) {
  23.     fprintf(stderr, "Usage: %s hostname portn", argv[0]);
  24.     exit(255);
  25.   }
  26.   while ((hent = gethostbyname(argv[1])) == NULL) {
  27.     switch(h_errno) {
  28.     case HOST_NOT_FOUND:
  29.     case NO_RECOVERY:
  30.     case NO_DATA:
  31.       fprintf(stderr,"Host %s not foundn", argv[1]);
  32.       exit(255);
  33.       break;
  34.     case TRY_AGAIN:
  35.       fprintf(stderr,"Failed to get address of %s, retryingn", argv[1]);
  36.       break;
  37.     }
  38.   }
  39.   if ((mysock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
  40.     perror("socket failed");
  41.     exit(255);
  42.   }
  43.   if (fcntl(mysock, F_SETFL, O_NONBLOCK)) {
  44.     perror("fcntl F_SETFL O_NONBLOCK failed");
  45.     exit(255);
  46.   }
  47.   mysa.sin_family = AF_INET;
  48.   memcpy(&mysa.sin_addr, hent->h_addr, hent->h_length);
  49.   errno = 0;
  50.   port = (short) strtol(argv[2], NULL, 10);
  51.   if (errno != 0) {
  52.     perror("invalid port");
  53.     exit(255);
  54.   }
  55.   mysa.sin_port = htons(port);
  56.   status = 0;
  57.   if ((connect(mysock,(struct sockaddr *) &mysa, sizeof(mysa))) < 0) {
  58.     if ((errno != EALREADY) && (errno != EINPROGRESS)) {
  59.       perror("connect failed");
  60.       exit(255);
  61.     } else {
  62.       status = 1;
  63.       perror("connect status");
  64.     }
  65.   } else {
  66.     fprintf(stderr, "connection succeeded!n");
  67.     exit(0);
  68.   }
  69.   while(status < 2) {
  70.     FD_ZERO(&rfds);
  71.     FD_ZERO(&wfds);
  72.     FD_ZERO(&efds);
  73.     FD_SET(mysock, &wfds);
  74.     mytv.tv_sec = 2;
  75.     mytv.tv_usec = 0;
  76.     while ((numfds = select(FD_SETSIZE - 1, &rfds, &wfds, &efds, &mytv)) < 0) {
  77.       if (errno != EINTR) {
  78. perror("select failed");
  79. exit(255);
  80.       }
  81.     }
  82.     if (numfds == 0) {
  83.       fprintf(stderr, "select returned with no fdsn");
  84.     } else {
  85.       if (FD_ISSET(mysock, &wfds)) {
  86. fprintf(stderr, "select returned socket writeble - trying to connectn");
  87.   if ((connect(mysock,(struct sockaddr *) &mysa, sizeof(mysa))) < 0) {
  88.     switch (errno) {
  89.     case EALREADY:
  90.     case EINPROGRESS:
  91.       status = 1;
  92.       perror("connect status");
  93.       break;
  94.     case EISCONN:
  95.       fprintf(stderr, "connection succeeded!n");
  96.       exit(0);
  97.       break;
  98.     default:
  99.       perror("connect failed");
  100.       exit(255);
  101.     }
  102.   } else {
  103.     fprintf(stderr, "connection succeeded!n");
  104.     exit(0);
  105.   }
  106.       }
  107.     }
  108.   }
  109.   /* we should never get here */
  110.   exit(1);
  111. }