socket的recv阻塞可不可以设置阻塞超时时间?

cqzkui 2010-06-26 09:39:23
定义了一个socketClient

用recv接收数据,send发送,可是总是阻塞到那里,能否设置阻塞超时的时间,超时能返回,我的程序必须用阻塞方式,是商务合作方决定了的。
...全文
给本帖投票
8788 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
khler 2010-10-27
  • 打赏
  • 举报
回复

一楼完全正解!
俺刚试了,Linux下、阻塞模式下的超时等待设置!
Eleven 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cqzkui 的回复:]
试了,没起作用的
[/Quote]
socket(...);
->
WSASocket(AF_INET, SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
然后setsockopt(SOCKET, SOL_SOCKET, SO_RCVTIMEO...);
setsockopt(SOCKET, SOL_SOCKET, SO_SNDTIMEO...);
xq830210 2010-06-28
  • 打赏
  • 举报
回复
开一个监听线程
周药师 2010-06-27
  • 打赏
  • 举报
回复
改成非阻塞吧
lijianli9 2010-06-27
  • 打赏
  • 举报
回复
用select的超时吧,不过用1楼的也可以,
fd_set fdRead;
timeval TimeOut;
TimeOut.tv_sec=0;
TimeOut.tv_usec=TIMEOUT;

FD_ZERO(&fdRead);
FD_SET(m_sock,&fdRead);
int ret=::select(0,&fdRead,NULL,NULL,&TimeOut);
这样select返回的时候可以根据ret的值判断时候有数据可读。ret>0可读,==0则是SOCKET_ERROR
jwybobo2007 2010-06-27
  • 打赏
  • 举报
回复
select,iocp模型带有超时处理,楼主可以怎么去看一下

另外你可以选择自己使用定时器控制,当然这样做的话需要注意很多问题,不推荐
cqzkui 2010-06-27
  • 打赏
  • 举报
回复
试了,没起作用的
hastings 2010-06-26
  • 打赏
  • 举报
回复
以下是来自于网上一篇文章中的摘录,它是这样写的:
int nNetTimeout=1000;//1秒,
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO, (char *)&nNetTimeout,sizeof(int));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO, (char *)&nNetTimeout,sizeof(int));
这样做在 Linux环境下是不会产生效果的,须如下定义:struct timeval timeout = {3,0};
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO, (char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO, (char *)&timeout,sizeof(struct timeval));
有两点注意就是:
1)recv ()的第四个参数需为MSG_WAITALL,在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。还要注意的是只要设置了接收超时,在没有MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等,到一定时间进行一次返回而已。
2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。
原文:http://blog.csdn.net/newger/archive /2008/05/19/2459113.aspx

18,363

社区成员

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

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

手机看
关注公众号

关注公众号

客服 返回
顶部