阻塞模式下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取走相应的数据
}

 

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
易语言中的wsarecv是一个网络编程函数,用于从指定的套接字接收数据。下面是对wsarecv的详细解释: wsarecv函数的语法: wsarecv(nsocket, lpbuf, dwbufsize, lpnum, lpflags, lpoverlapped, lpcallback) 参数说明: - nsocket:指定的套接字句柄。 - lpbuf:指向一个缓冲区,用于接收数据。 - dwbufsize:缓冲区的大小。 - lpnum:指向一个变量,返回实际接收到的字节数。 - lpflags:指向一个变量,指定接收操作的附加标志。 - lpoverlapped:指向一个OVERLAPPED结构的指针,用于指定异步操作。 - lpcallback:指向一个回调函数,用于处理异步操作的完成。 wsarecv函数的功能: wsarecv函数使用指定的套接字接收数据,并将接收数据存储到指定的缓冲区中。通过该函数,程序可以从网络中接收数据,实现网络通信功能。 wsarecv函数的返回值: - 若函数调用成功,则返回0,表示接收数据成功。 - 若函数调用失败,则返回一个错误代码,表示接收数据失败。 注意事项: - 调用wsarecv函数前,需要先创建套接字、连接服务器,并进行相应的配置。 - wsarecv函数属于同步函数,即在接收数据完成之前,会一直等待数据的到达。如果需要实现异步操作,应使用指定的OVERLAPPED结构和回调函数。 总结: wsarecv是易语言中用于接收数据的网络编程函数。通过调用该函数,程序可以从指定的套接字接收数据,并将接收到的数据存储到指定的缓冲区中。此函数在网络通信中起到了重要的作用,使程序能够实现网络数据接收功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值