当前位置:首页 > 开发 > 操作系统 > 正文

阻塞模式下WSARecv接收大块数据的超时问题

发表于: 2013-08-12   作者:aigo   来源:转载   浏览次数:
sar
摘要: 阻塞模式下WSARecv接收较大数据时,WSARecv并不一定会等到接收到指定大小的消息后再返回,而是接收到一定量数据了也会强制返回。例如:   WSABUF DataBuf; DataBuf.buf = new char[1024 * 10]; DataBuf.len = 4096; DWORD RecvBytes, Flags = 0; int rs = WSARecv(

阻塞模式下WSARecv接收较大数据时,WSARecv并不一定会等到接收到指定大小的消息后再返回,而是接收到一定量数据了也会强制返回。例如:

 

WSABUF DataBuf;
DataBuf.buf = new char[1024 * 10];
DataBuf.len = 4096;
DWORD RecvBytes, Flags = 0;
int rs = WSARecv(socket, &DataBuf, 1, &RecvBytes, &Flags, NULL, NULL);

 

这里可能不会等到接收到4096个字节后返回,可能接受3000个字节就会返回,及时设置了接收延迟和接受缓冲区大小,也不起作用,我想这个setsockopt方法是不是只对recv有效(setsockopt貌似是winsock1.1的函数),这个很奇怪,知道原因所在的希望各位帮忙解答下

//发送缓冲区
int nSendBuf = 64*1024;
setsockopt(conn_socket, SOL_SOCKET, SO_SNDBUF, (const char*)&nSendBuf, sizeof(int));

//设置接收超时(对WSARecv不起作用,只对阻塞式recv起作用)
int nNetTimeout = 3000;//3秒,
setsockopt(conn_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));

 

这样只能自己写逻辑做保护:

WSABUF DataBuf;
DataBuf.buf = recv_buf;
DWORD RecvBytes, Flags;
bool setLen = true;
while(true)
{
	if(setLen)
	{
		DataBuf.buf = recv_buf;
		DataBuf.len = 4096;
	}
	
	RecvBytes = 0;
	Flags = 0;
	rs = ::WSARecv(bingo_net->GetSocket(), &DataBuf, 1, &RecvBytes, &Flags, NULL, NULL);
	if(RecvBytes < DataBuf.len)
	{
		DataBuf.buf += RecvBytes;
		DataBuf.len -= RecvBytes;
		setLen = false;
		continue;
	}

	setLen = true;
	
	//...
	//拿到一帧消息后从DataBuf取走相应的数据
}

 

想大家请教,这是什么原因?

阻塞模式下WSARecv接收大块数据的超时问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
我们经常会讨论到数据访问超时的问题,当数据库服务器在远程,而且该操作需要耗用较长的时间的时侯
  项目里使用了第三方的SDK BuzzBox来实现Notification的消息推送功能。消息推送后,点击打开应用
从:http://blog.sina.com.cn/s/blog_5d0990c7010115ib.html 转载 Socket 阻塞与非阻塞模式 阻塞模
通过phpinfo()可以看到php支持的session存储方式有: 可以看出session的存储方式有文件、用户自定义
前些天一个棘手的问题,早上上班刚到公司不久,就发现系统里面出现了大量的查询超时。 一开始以为是
最近调试WCF功能,遇到很奇怪的问题,折腾了一天,才解决了这个错误,现在分享给大家,防止大家走弯
适合初中级读者阅读 有时,花上几个小时阅读、调试、跟踪优秀的源码程序,能够更快地掌握某些技术关
想必大家在用MySQL时都会遇到连接超时的问题,如下图所示: 就是这个异常(com.mysql.jdbc.exception
想必大家在用MySQL时都会遇到连接超时的问题,如下图所示: 就是这个异常(com.mysql.jdbc.exception
文章转自:http://sarin.iteye.com/blog/580311 想必大家在用MySQL时都会遇到连接超时的问题,如下图
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号