How to set a socket connection timeout






4.92/5 (23 votes)
Resolve long timeout when connection target is unavailable
Sometimes, the connect time-out can take too much time when the target is unavailable. To resolve this issue, we can use non-blocking socket mode to select the timeout.
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; }