概述
使用Winsock connect函数,无法设置超时,而在连接一个不存在的主机时,将会阻塞至少要几十秒。其实在调用connect函数时,将socket设置为非阻塞,然后调用select函数,可以达到设置超时的效果。
bool 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 connect 函数设置超时所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复