使用Winsock connect函数,无法设置超时,而在连接一个不存在的主机时,将会阻塞至少要几十秒。其实在调用connect函数时,将socket设置为非阻塞,然后调用select函数,可以达到设置超时的效果。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40bool ConnectWithTimeout(SOCKET socket, char * host, int port, int timeout) { TIMEVAL timeval = {0}; timeval.tv_sec = timeout; timeval.tv_usec = 0; struct sockaddr_in address; address.sin_family = AF_INET; address.sin_port = htons(port); address.sin_addr.s_addr = inet_addr(host); if(address.sin_addr.s_addr == INADDR_NONE) return false; // set the socket in non-blocking unsigned long mode = 1; int result = ioctlsocket(socket, FIONBIO, &mode); if (result != NO_ERROR) printf("ioctlsocket failed with error: %ldn", result); connect(socket, (struct sockaddr *)&address, sizeof(address)); // restart the socket mode mode = 0; result = ioctlsocket(socket, FIONBIO, &mode); if (result != NO_ERROR) printf("ioctlsocket failed with error: %ldn", result); fd_set Write, Err; FD_ZERO(&Write); FD_ZERO(&Err); FD_SET(socket, &Write); FD_SET(socket, &Err); // check if the socket is ready select(0, NULL, &Write, &Err, &timeval); if(FD_ISSET(socket, &Write)) return true; return false; }
最后
以上就是多情牛排最近收集整理的关于socket connect 函数设置超时的全部内容,更多相关socket内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复