socket connect timeout

-- VC++ 2009. 9. 2. 11:15
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
* nonblocking socket을 이용한 Rechard stevens의 소스

  1. #include    "unp.h"
  2.  
  3. int connect_nonb(int sockfd,const SA *saptr, socklen_t salen,int nsec)
  4. {
  5.     int                flags, n, error;
  6.     socklen_t        len;
  7.     fd_set            rset, wset;
  8.     struct timeval   tval;
  9.  
  10.     flags = Fcntl(sockfd, F_GETFL, 0);
  11.     Fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
  12.  
  13.     error =0;
  14.     if((n = connect(sockfd,(struct sockaddr *) saptr, salen))< 0)
  15.         if(errno != EINPROGRESS)
  16.             return(-1);
  17.  
  18.     /* Do whatever we want while the connect is taking place. */
  19.  
  20.     if(n == 0)
  21.         goto done;    /* connect completed immediately */
  22.  
  23.     FD_ZERO(&rset);
  24.     FD_SET(sockfd,&rset);
  25.     wset = rset;
  26.     tval.tv_sec= nsec;
  27.     tval.tv_usec=0;
  28.  
  29.     if((n = Select(sockfd+1,&rset,&wset, NULL, nsec ?&tval : NULL))== 0){
  30.         close(sockfd);        /* timeout */
  31.         errno = ETIMEDOUT;
  32.         return(-1);
  33.     }
  34.  
  35.     if(FD_ISSET(sockfd,&rset)|| FD_ISSET(sockfd,&wset)){
  36.         len =sizeof(error);
  37.         if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR,&error,&len)< 0)
  38.             return(-1);            /* Solaris pending error */
  39.     }else
  40.         err_quit("select error: sockfd not set");
  41.  
  42. done:
  43.     Fcntl(sockfd, F_SETFL, flags);    /* restore file status flags */
  44.  
  45.     if(error){
  46.         close(sockfd);        /* just in case */
  47.         errno = error;
  48.         return(-1);
  49.     }
  50.     return(0);
  51. }
예전에 포스팅 한 http socket client에 적용하면서 windows 버전으로도 만들어 봤습니다.

  1. int CHttpSocket::connect_nonb(int sockfd,conststruct sockaddr *saptr, socklen_t salen,struct timeval tval)
  2. {
  3.     int                flags, n, error;
  4.     socklen_t        len;
  5.     fd_set            rset, wset;
  6.  
  7. #ifdef WIN32
  8.     int nonblocking =1;
  9.     ioctlsocket(sockfd, FIONBIO,(unsignedlong*)&nonblocking);
  10. #else
  11.     flags = fcntl(sockfd, F_GETFL, 0);
  12.     fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
  13. #endif
  14.  
  15.     error =0;
  16.     if((n = connect(sockfd,(struct sockaddr *) saptr, salen))<0)
  17.     {
  18. #ifdef WIN32
  19.         errno = WSAGetLastError();
  20. #endif
  21.         if(errno != EINPROGRESS && errno!= EWOULDBLOCK)
  22.         {
  23.             return(-1);
  24.         }
  25.     }
  26.  
  27.     /* Do whatever we want while the connect is taking place. */
  28.  
  29.     if(n == 0)
  30.         goto done;    /* connect completed immediately */
  31.  
  32.     FD_ZERO(&rset);
  33.     FD_SET(sockfd,&rset);
  34.     wset = rset;
  35.  
  36.     if((n = select(sockfd+1,&rset,&wset, NULL,
  37.                      ((tval.tv_sec>0)||(tval.tv_usec>0))?&tval : NULL))== 0)
  38.     {
  39.         close(sockfd);        /* timeout */
  40.         errno = ETIMEDOUT;
  41.         return(-1);
  42.     }
  43.  
  44.     if(FD_ISSET(sockfd,&rset)|| FD_ISSET(sockfd,&wset))
  45.     {
  46. #ifndef WIN32
  47.         len =sizeof(error);
  48.         if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR,&error,&len)< 0)
  49.             return(-1);            /* Solaris pending error */
  50. #endif
  51.     }else
  52.         return(-1);//err_quit("select error: sockfd not set");
  53.  
  54. done:
  55. #ifdef WIN32
  56.     nonblocking =0;
  57.     ioctlsocket(sockfd, FIONBIO,(unsignedlong*)&nonblocking);
  58. #else
  59.     fcntl(sockfd, F_SETFL, flags);    /* restore file status flags */
  60. #endif
  61.  
  62.     if(error){
  63.         close(sockfd);        /* just in case */
  64.         errno = error;
  65.         return(-1);
  66.     }
  67.     return(0);
  68. }
출처 : http://newtype.pe.kr/345

'-- VC++' 카테고리의 다른 글

유니코드로 개발하기 (MFC프로젝트)  (0) 2009.09.24
MFC 상태 정보 관리  (0) 2009.09.08
So you need a worker thread pool...  (0) 2009.08.11
Polling by sleeping vs polling by waiting with a timeout  (0) 2009.08.11
Debug Heap Management  (0) 2009.06.12
posted by 어린왕자악꿍