+ -
当前位置:首页 → 问答吧 → 有关非阻塞connect

有关非阻塞connect

时间:2010-09-01

来源:互联网

  1. int SocketConnect(int *sock, char *ip, unsigned short port)
  2. {
  3.         int ret ;
  4.         int sockfd ;
  5.         if(*sock<=0)
  6.         {
  7.                 struct sockaddr_in addr;
  8.                 sockfd = socket(AF_INET, SOCK_STREAM, 0);
  9.                 if(sockfd == -1)
  10.                 {
  11.                         return -1;
  12.                 }
  13.                 {
  14.                         int flag = 1;               
  15. #ifdef _WIN32
  16.                         ioctlsocket(sockfd, FIONBIO, &flag);
  17. #else
  18.                         flag = fcntl(sockfd, F_GETFL, 0);
  19.                         fcntl(sockfd, F_SETFL, flag | O_NONBLOCK);
  20. #endif       
  21.                 }
  22.                 addr.sin_family = AF_INET;
  23.                 addr.sin_port = htons(port);
  24.                 addr.sin_addr.s_addr = inet_addr(ip);

  25.                 ret = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));

  26.                 if(ret < 0)
  27.                 {
  28. #ifdef OS_WIN
  29.                         if(WSAGetLastError()==EINPROGRESS)
  30. #else
  31.                         if(errno==EINPROGRESS)
  32. #endif
  33.                         {
  34.                                 *sock=sockfd;
  35.                                 return 1;
  36.                         }
  37.                         else
  38.                         {
  39. #ifdef OS_WIN
  40.                                 closesocket(sockfd);
  41. #else
  42.                                 close(sockfd);
  43. #endif
  44.                                 return -2;
  45.                         }
  46.                 }
  47.                 return 0;
  48.         }
  49.         else
  50.         {
  51.                 fd_set fdset;
  52.                 struct timeval tv;
  53.                 int valopt;
  54.                 int lon;
  55.                 sockfd=*sock;
  56.                 tv.tv_sec = 0;
  57.                 tv.tv_usec = 1000;
  58.                 FD_ZERO(&fdset);
  59.                 FD_SET(sockfd, &fdset);
  60.                 ret = select(sockfd+1, NULL, &fdset, NULL, &tv);
  61.                 if (ret < 0 )//&& errno != EINTR)
  62.                 {
  63.                         return 1;                                                             //?????   这返回1  ? 1 是成功,对吗
  64.                 }
  65.                 else if (ret > 0)
  66.                 {
  67.                         lon = sizeof(int);
  68.                         if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon) < 0 || valopt)
  69.                         {  
  70. #ifdef OS_WIN
  71.                                 closesocket(sockfd);
  72. #else
  73.                                 close(sockfd);
  74. #endif
  75.                                 *sock=0;
  76.                                 return -3;
  77.                         }
  78.                         return 0;
  79.                 }
  80.                 return 1;
  81.         }
  82. }
复制代码
如上代码标记
                if (ret < 0 )//&& errno != EINTR)
                {
                        return 1;                                                             //?????   这返回1  ? 1 是成功,对吗
                }

作者: sytpb   发布时间: 2010-09-01

On success, select() and pselect() return the number of file descriptors contained in
       the three returned descriptor sets (that is, the total number of bits that are set in
       readfds,  writefds,  exceptfds)  which may be zero if the timeout expires before any-
       thing interesting happens.  On error, -1 is returned, and errno is set appropriately;
       the  sets  and  timeout  become  undefined, so do not rely on their contents after an
       error.

作者: rain_fish   发布时间: 2010-09-01

相关阅读 更多

热门下载

更多