如何设置网络操作超时?

mrnian2008 2008-09-26 05:09:43
在连接服务器时,有时长时间连接不上,就一直阻塞在那里不动了,有时是接收数据时也会出现这种问题。
我想用定时器来处理一下,比如连接阻塞超过20秒我就再连接一次,如果还不行就不连了,请问怎么处理?
我的连接函数为ConnectServer(strIp,nPort);
...全文
209 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mrnian2008 2008-10-24
  • 打赏
  • 举报
回复
谢谢大家,结贴给分。
zolen 2008-10-15
  • 打赏
  • 举报
回复
setsockopt 就可以轻松设置发送和接受超时.
奉海 2008-10-13
  • 打赏
  • 举报
回复
用异步方式
lhtang 2008-10-13
  • 打赏
  • 举报
回复
创建非组塞套接口就对了,其实楼上都正解了.
kmarshal 2008-10-13
  • 打赏
  • 举报
回复
使用非阻塞SOCK,创建一个事件,绑定该SOCKET的FD_CONNECT事件,投递完CONNECT后使用
DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 函数的第二个参数就是你要设置的超时时间,通过判断WaitForSingleObject的返回值就可以知道是超时还正常返回了
mrnian2008 2008-10-08
  • 打赏
  • 举报
回复
不行啊 还是阻塞在CONNECT上了
WinEggDrop 2008-09-26
  • 打赏
  • 举报
回复
1.将socket设置为非阻塞

struct timeval ConnectionTimeOut;
ConnectionTimeOut.tv_sec = 8;
ConnectionTimeOut.tv_usec = 0;
while(TRUE)
{
iRet = connect(ClientSocket, (LPSOCKADDR)&ssin, sizeof(SOCKADDR_IN));
if (iRet == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
break;
}
}
else
{
IsFlag = TRUE;
break;
}

FD_ZERO(&fdwrite);
FD_ZERO(&fdexcept);
FD_SET(ClientSocket,&fdwrite);
FD_SET(ClientSocket,&fdexcept);
select(0,NULL,&fdwrite,&fdexcept,&ConnectionTimeOut);

if (FD_ISSET(ClientSocket,&fdexcept)) // 出现错误
{
break;
}

if (FD_ISSET(ClientSocket,&fdwrite)) // 成功连接上
{
break;
}
else
{
break;
}
}


以上代码就是8秒超时连接
chenchangxiong 2008-09-26
  • 打赏
  • 举报
回复
用select函数好像可以设置,不过我遇到这个问题使用多线程解决的

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧