众所周知,在进行网络编程的时候,如果使用系统connect函数,无法设置超时,而在连接一个不存在的主机时,将会一直阻塞。
其实在调用connect函数时,将句柄设置为非阻塞,然后调用select函数,可以达到设置超时的效果。
- bool connect(char *host,int port, int timeout)
- {
- TIMEVAL Timeout;
- Timeout.tv_sec = timeout;
- Timeout.tv_usec = 0;
- struct sockaddr_in address; /* the libc network address data structure */
- sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- address.sin_addr.s_addr = inet_addr(host); /* assign the address */
- address.sin_port = htons(port); /* translate int2port num */
- address.sin_family = AF_INET;
- //set the socket in non-blocking
- unsigned long iMode = 1;
- int iResult = ioctlsocket(sock, FIONBIO, &iMode);
- if (iResult != NO_ERROR)
- {
- printf("ioctlsocket failed with error: %ld\n", iResult);
- }
- if(connect(sock,(struct sockaddr *)&address,sizeof(address))==false)
- {
- return false;
- }
- // restart the socket mode
- iMode = 0;
- iResult = ioctlsocket(sock, FIONBIO, &iMode);
- if (iResult != NO_ERROR)
- {
- printf("ioctlsocket failed with error: %ld\n", iResult);
- }
- fd_set Write, Err;
- FD_ZERO(&Write);
- FD_ZERO(&Err);
- FD_SET(sock, &Write);
- FD_SET(sock, &Err);
- // check if the socket is ready
- select(0,NULL,&Write,&Err,&Timeout);
- if(FD_ISSET(sock, &Write))
- {
- return true;
- }
- return false;
- }