关于connect超时的问题,请大家指教
由于系统默认的connect超时时间有点长,所以我想自己设定connect超时时间的值,采用的是非阻塞模式+select的方法,就在下面:
SOCKET hsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
unsigned long ul = 1; //首先设置为非阻塞模式
int ret = ioctlsocket(hsocket, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)return;
//连接一台PC
connect(hsocket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(hsocket, &r); //设置slect参数
timeout.tv_sec = 0; //设置超时时间
timeout.tv_usec =10000;
ret = select(0, 0, &r, 0, &timeout); //通过判断socket是否可写
//来判断连接是否成功
if ( ret <= 0 )
{
printf("connect fail\n");
}
else
{
printf("connect success\n");
}
可是在程序运行前断开与目标PC的连接,然后运行程序,在超时时间之前恢复与目标PC的连接,仍然显示连接失败。我这么做哪里有错误呢,有什么办法能够正确设置超时时间啊? 刚刚开始接触网络方面的东西,请大家多多帮忙。
问题点数:100、回复次数:5Top
1 楼daiybh()回复于 2006-11-03 17:57:13 得分 25
http://blog.bcchinese.net/v45072501/archive/2006/06/05/73642.aspx
看看这..Top
2 楼nuaawenlin(飘人)回复于 2006-11-03 21:25:54 得分 25
这就要看看tcp的keepalive时间了,不过你等待10秒,估计是少了些Top
3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2006-11-03 21:41:35 得分 25
用一个ConnectHelper线程来做?如果超规定的时间都没连接成功,关闭Socket,终止线程?Top
4 楼baojian88888(机器人)回复于 2006-11-06 10:34:11 得分 25
tcp的连接过程是需要三次握手的(syn, syn/ack, ack),你这样pc断开连接,三次握手都不能进行吧Top
5 楼ccaccbccc(好吃的雪糕)回复于 2006-11-06 11:20:05 得分 0
大家好,我是楼主。如果在Linux下使用非阻塞模式+Select,使用起来是正常的。所以感觉很是奇怪,呵呵。
To daiybh() 我就是从那篇文章中学到的这个办法的,^_^
To nuaawenlin(飘人) tcp的keepalive时间默认应该是7200秒,我再把等待时间设的长些试试
To DentistryDoctor(不在无聊中无奈,就在沉默中变态) 这是一个好办法,我尝试一下。
To baojian88888(机器人) 可是在Linux下却是可以的,select模型我也不是很熟悉,迷惑中
谢谢大家的帮助
Top




