winsock 连接超时时间设置
#include "winsock2.h" #pragma comment(lib,"WS2_32.lib") #include "stdio.h" int main(int argc, char* argv[]) { WSADATA wsaData; WORD sockVersion = MAKEWORD(2,0); WSAStartup(sockVersion, &wsaData); SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(s == INVALID_SOCKET) { return -1; } //设置非阻塞方式连接 unsigned long ul = 1; int ret = ioctlsocket(s, FIONBIO, (unsigned long*)&ul); if(ret == SOCKET_ERROR) return -1; sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(81); servAddr.sin_addr.S_un.S_addr = inet_addr("172.172.173.209"); connect(s,(sockaddr*)&servAddr,sizeof(servAddr)); //select 模型,即设置超时 fd_set r; FD_ZERO(&r); FD_SET(s, &r); struct timeval timeout ; timeout.tv_sec = 3; //连接超时3秒 timeout.tv_usec =0; ret = select(0, 0, &r, 0, &timeout); if(ret <= 0) { closesocket(s); return -1; } //设回阻塞模式 ret = ioctlsocket(s, FIONBIO, (unsigned long*)&ul); if(ret == SOCKET_ERROR){ closesocket(s); return -1; } //设置发送超时6秒 int TimeOut = 6000; if(setsockopt(s,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut)) == SOCKET_ERROR){ return 0; } //设置接收超时6秒 TimeOut = 6000; if(setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut)) == SOCKET_ERROR){ return 0; } WSACleanup(); return 0; }