关于socket连接超时的解决
客户端程序基于TCP/IP连接服务器
int err;
//设置非阻塞方式连接
unsigned long ul = 1;
err = ioctlsocket(ConnectSocket, FIONBIO, (unsigned long*)&ul);
if(err == SOCKET_ERROR)
{
return;
}
connect(ConnectSocket,(const struct sockaddr *)&AddrConnect,sizeof(AddrConnect));
//select 模型设置超时
struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(ConnectSocket, &r);
timeout.tv_sec = 20; //连接超时20秒
timeout.tv_usec =0;
err = select(0, 0, &r, 0, &timeout);
if ( err <= 0 )
{
::closesocket(ConnectSocket);
return;
}
//非锁定模式套接设回阻塞模式
unsigned long ul1= 0 ;
err = ioctlsocket(ConnectSocket, FIONBIO, (unsigned long*)&ul1);
if(err==SOCKET_ERROR)
{
::closesocket (ConnectSocket);
return;
}
其中connect和select都是放在线程中处理的
会不会因连接的超时而引起线程的挂起?
[解决办法]
如果你设置是异步模式的话,connect可能不会立刻成功,
你要到下面的select(0, 0, &r, 0, &timeout);设置等待时间判断有没有连接成功
[解决办法]
你的代码当select失败就直接退出线程了,这个是不合适的,select失败也许是阻塞了。你应该在失败后获取失败代码,如果是阻塞引起的失败,应该过一段时间(比如几个毫秒后)再尝试,这样才是正确的。
在同步模式下的connect如果说成功,你也应该使用获取失败代码来看看失败的原因。
按我说的自己调试一下。希望对你有帮助。
我的电邮:zhaoli_824@163.com 希望可以和大家交流相关的技术。