`
aigo
  • 浏览: 2569015 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

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

 

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

分享到:
评论

相关推荐

    CSocket类数据接收存在的问题及Win32函数解决办法

    在多线程环境中,多个线程可能同时尝试接收数据,如果没有适当的同步措施,可能会引发数据竞争,造成数据混乱。 再者,`CSocket`的错误处理相对简单,当接收失败时,它可能只返回一个错误代码,而没有提供足够的...

    使用阻塞模式、完成端口的多线程socket iocp

    在Socket编程中,阻塞模式是指调用recv或send等I/O操作时,如果数据未准备好,函数会挂起,直到数据可用或超时。而非阻塞模式则不同,当没有数据可读或无法写入时,函数会立即返回一个错误代码,而不是等待。然而,...

    封包助手包括Send,Recv,WSASend,WSARecv,SendTo等

    封包助手是一个能拦截网络应用程序数据包的纯绿色软件(压缩包不足400KB,无插件无病毒,不需安装),包括Send,Recv,WSASend,WSARecv,SendTo,RecvFrom,WSASendTo,WSARecvFrom。 封包助手还可以拦截Connect和Accept...

    hook send recv wsasend wsarecv 封包工具源码

    hook send recv wsasend wsarecv 封包工具源码 本工具支持命令行操作,采用远程线程注入目标进程,注入后hook发包函数,实现封包拦截。 主程序为MFC编写 动态链接库VC WIN32项目

    基于socket异步通讯模式的代码

    4. **发送和接收数据**:使用`WSASend`和`WSARecv`函数进行数据的发送和接收。这两个函数支持重叠操作,可以在数据传输期间继续执行其他任务。它们会返回立即,即使数据实际并未发送或接收。当数据传输完成后,系统...

    winsocket入门教程

    6. **发送与接收数据**:使用`send`和`recv`函数进行数据的发送与接收。在阻塞模式下,这些函数会一直等待直到数据发送完成或接收到数据。 7. **关闭连接**:通信结束后,使用`closesocket`函数关闭套接字。 在第...

    IOCP 接收线程和工作线程

    IOCP的优点在于它能有效地利用多核处理器,允许多个线程同时处理I/O操作,避免了传统同步I/O模型中的阻塞问题。此外,由于工作线程只处理I/O完成,而不是等待I/O操作,因此它们可以快速响应,提高整体性能。 在设计...

    WindowsSocketIO模型.pdf

    在阻塞模式下,当调用`recv`或`send`函数时,如果数据未准备好,函数会挂起当前线程,直至数据可用。这种方式简单易用,但在多连接或并发处理时可能导致性能问题,因为线程可能会被长时间阻塞,造成资源浪费。为了...

    vc以IOCP完成端口方式实现网络数据传输 iocp服务器+客户端.zip

    客户端会通过Connect函数连接到服务器,并进行数据的发送和接收。 - 异步IOCP客户端:虽然这里没有提供具体实现,但理论上客户端也可以利用IOCP模型进行异步的网络通信,以提高效率。 6. 数据传输: 一旦服务器和...

    Windows网络编程技术

    - 发送和接收数据,使用`send`和`recv`函数。 - 关闭Socket,调用`closesocket`函数。 - 最后,调用`WSACleanup`清理Winsock库。 2. UDP Socket:UDP不保证数据的顺序或完整性,但具有更低的延迟,适合实时应用...

    IOCP模型实例(完成端口模型)

    4. 接收数据:使用`WSARecv`异步接收数据。 5. 关闭连接:在完成通信后,关闭套接字和完成端口。 IOCP模型在高并发场景下表现优秀,如网络游戏、文件服务器、数据库服务器等,因为它能有效利用系统资源,提高系统...

    抓封包C++原程序.zip_c++封包_socket抓包程序_封包_抓包_抓封包

    Socket是计算机网络中的一个接口,它允许应用程序通过网络发送和接收数据。在C++中,我们通常使用套接字库(如Berkeley Sockets)来创建和操作socket对象。`#include &lt;sys/socket.h&gt;` 和 `#include &lt;netinet/in.h&gt;` ...

    异步通讯CSSocket

    4. 接收数据,使用WSARecv函数异步接收服务器发送的数据。 在Vc6下编译并通过的CSSocket代码,可以在Windows 2003、98以及XP等操作系统下正常运行。这意味着它兼容了多种不同的Windows版本,具有较好的兼容性。 在...

    IOCP.rar_IOCP_IOCP 完成端口_iocp实验报告_visual c

    - 使用WSASend发送数据,WSARecv接收数据,同样利用IOCP异步处理。 五、实验注意事项 在实验过程中,需要注意以下几点: - 异步I/O可能导致数据乱序,需要设计合理的数据包格式和顺序确认机制。 - 线程池的管理,...

    winsock相关编程源代码

    - **客户端实现**:如何创建一个简单的TCP或UDP客户端,连接到指定的服务器并发送/接收数据。 - **服务器实现**:如何构建一个能够处理多个并发连接的服务器,包括连接管理、数据处理和资源释放。 这些源代码实例...

    winsock收发结构体

    3. `WSABUF` 结构体:在发送和接收数据时,`WSABUF`结构体用于封装缓冲区的地址和长度。在使用`send`或`recv`函数时,可以传递一个`WSABUF`数组来处理多个数据块。 4. `WSAOVERLAPPED` 结构体:在异步编程中,这个...

    PacketLogger-ateS:WSARecv-WSASendRecv-发送嗅探器

    - `WSARecv`函数用于从一个或多个套接字接收数据。这个函数是异步的,允许应用程序同时处理多个套接字的数据接收,提高了效率。 - 它可以接收部分数据包,这意味着如果一个数据包比接收缓冲区大,`WSARecv`可以只...

    Socket Send and Receive

    ### Socket中的Send与Receive函数详解 在网络编程领域中,数据的发送与接收是核心操作之一。...在接收数据时,可能需要增加超时控制等功能。希望本篇文章能够为读者在网络编程的学习道路上提供一定的帮助。

    深入了解异步套接字

    1. FD_READ事件:表示套接字可读,此时可以通过recv或WSARecv等函数接收数据。在DoCallBack中,如果FD_READ事件发生,会尝试通过IOCtl(FIONREAD)获取可读字节数,然后调用OnReceive处理数据接收。 2. FD_WRITE事件...

    封包截取器

    故不能取到自己的ip和端口) &lt;br&gt;5、增加Toolbar,方便使用 &lt;br&gt;6、增加自动开缓冲功能(普通模式在一些特殊应用网络数据量很大时,列表内的数据可能会丢失,此功能可避免此问题) &lt;br&gt; 2006.4.6(VER:...

Global site tag (gtag.js) - Google Analytics