关于connect连接超时的问题
根据csdn和其他网络资源的例子,我写了如下代码,想通过select的超时来实现connect的超时,但在vc里面调试时老是出现select返回0的问题,即无法真正做到超时。
我的实现如下:
首先在一个pc上开启tcp的server,然后调试如下代码,设置超时60s,先断开连接,在10s后开启连接,但select还是返回0(超时),这样根本达不到超时connect的需求啊,可是在unix/linux下的很多示例代码也是这么写的,在csdn上antghazi的vc代码也是这样写的啊(他号称实现了超时,可是我怎么也试验不出来),请问高手怎么回事。
相关代码如下:
//设置非阻塞方式socket
unsigned long ul = 1;
int ret;
ret = ioctlsocket(SLocal, FIONBIO, (unsigned long*)&ul);
if(ret == SOCKET_ERROR)
return;
ret = connect(SLocal, (const struct sockaddr *)&Serv, sizeof(Serv));
//select 模型,即设置超时
struct timeval timeout;
fd_set r;
FD_ZERO(&r);
FD_SET(SLocal, &r);
timeout.tv_sec = 60; //连接超时60秒
timeout.tv_usec =0;
switch(select(SLocal+1, 0, &r, 0, &timeout))
{
case -1: //select fail
::closesocket(SLocal);
return;
case 0: //连接超时
::closesocket(SLocal);
return;
default: //连接成功
break;
}
//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(SLocal, FIONBIO, (unsigned long*)&ul1);
if(ret == SOCKET_ERROR)
{
::closesocket (SLocal);
return;
}
if (FD_ISSET(SLocal, &r) == 0)
return;