首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于socket连接超时的解决,该怎么处理

2012-02-28 
关于socket连接超时的解决客户端程序基于TCP/IP连接服务器interr//设置非阻塞方式连接unsignedlongul1e

关于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 希望可以和大家交流相关的技术。

热点排行