直接上代码:
设置连接超时
//首先改成非阻塞套接字 unsigned long ul=1; int rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); if(rm==-1) { printf("ioctl noblock error! "); close(sConnect); return -3; } //向服务器发出连接请求 int err = connect(sConnect, (struct sockaddr*)&addrServer, sizeof(addrServer)); //正常返回EINPROGRESS if(err && errno!=EINPROGRESS) { printf("cannot connect:%s ",severAgent); return -4; } //有可能返回0 if (err==0) { printf("connect suceess!"); } else { struct timeval tv; fd_set /*r,*/w; // FD_ZERO(&r); FD_ZERO(&w); // FD_SET(sConnect,&r); FD_SET(sConnect,&w); tv.tv_sec=m_conTimeout; tv.tv_usec=0; int retval = select(sConnect+1,0,&w,0,&tv); if(retval==-1) { printf("select error "); return -5; } else if(retval == 0) { printf("connect timeout "); return -6; } else { int er; socklen_t len = sizeof(er); if (getsockopt(sConnect, SOL_SOCKET, SO_ERROR, (char *)&er, &len) < 0) { //getsockopt()失败,进行错处理 printf("getsockopt error "); return -8; } if (er != 0) { //connect()失败,进行错处理 printf("connect error "); return -9; } } }
//改为阻塞 ul=0; rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); if(rm==-1) { printf("ioctl block error! "); close(sConnect); return -7; }
值得注意的是:linux中,如果服务器的地址无效,则以上超时过程正常。如果服务器地址有效,但是服务程序未开启,则直接返回错误,也就是说超时过程不起作用,说明是已经做了目标网络检测了。
但是window中,同样是以上的代码,如果服务器的地址无效,则以上超时过程正常。如果服务器地址有效,但是服务程序未开,以上超时过程也是正常的。
二者还是有点区别的。