socket 非阻塞模式下的connect封装实现

来源:互联网 发布:高性能网络编程 二 编辑:程序博客网 时间:2024/06/05 21:11
connect 在非阻塞模式下,返回值 为0的时候表示 已建立连接;返回值为-1,且此时错误值是 EINPROGRESS时,,表示连接进行的3次握手正在进行。需要后续通过select或者是epoll来判断,如果select返回值为1,此时任然需要判断 socket是否有错。通过getsockopt来获取socket的错误值。
flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); if ((retVal = connect(sockfd, saptr, salen)) < 0)     if (errno != EINPROGRESS)  return (-1); if (retVal == 0) {     // restore file status flags     fcntl(sockfd, F_SETFL, flags);       return 0; } FD_ZERO(&rset); FD_SET(sockfd, &rset); wset = rset; tval.tv_sec = nsec; tval.tv_usec = 0; if ((retVal = select(sockfd + 1, &rset, &wset, NULL, &tval)) == 0)  {     // timeout     close(sockfd);               errno = ETIMEDOUT;     return (-1); } if (retVal < 0)  {     // select() failed     return (-1); } if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset))  {     len = sizeof(error);     error = 0;     if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)  return (-1);          if (error > 0) //<<<<< error == EINPROGRESS >>>     {   close(sockfd);  errno = error;  return (-1);     } }  else {     return (-1); } // restore file status flags fcntl(sockfd, F_SETFL, flags);  

0 0
原创粉丝点击