阻塞模式下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`的错误处理相对简单,当接收失败时,它可能只返回一个错误代码,而没有提供足够的...
在Socket编程中,阻塞模式是指调用recv或send等I/O操作时,如果数据未准备好,函数会挂起,直到数据可用或超时。而非阻塞模式则不同,当没有数据可读或无法写入时,函数会立即返回一个错误代码,而不是等待。然而,...
封包助手是一个能拦截网络应用程序数据包的纯绿色软件(压缩包不足400KB,无插件无病毒,不需安装),包括Send,Recv,WSASend,WSARecv,SendTo,RecvFrom,WSASendTo,WSARecvFrom。 封包助手还可以拦截Connect和Accept...
hook send recv wsasend wsarecv 封包工具源码 本工具支持命令行操作,采用远程线程注入目标进程,注入后hook发包函数,实现封包拦截。 主程序为MFC编写 动态链接库VC WIN32项目
4. **发送和接收数据**:使用`WSASend`和`WSARecv`函数进行数据的发送和接收。这两个函数支持重叠操作,可以在数据传输期间继续执行其他任务。它们会返回立即,即使数据实际并未发送或接收。当数据传输完成后,系统...
6. **发送与接收数据**:使用`send`和`recv`函数进行数据的发送与接收。在阻塞模式下,这些函数会一直等待直到数据发送完成或接收到数据。 7. **关闭连接**:通信结束后,使用`closesocket`函数关闭套接字。 在第...
IOCP的优点在于它能有效地利用多核处理器,允许多个线程同时处理I/O操作,避免了传统同步I/O模型中的阻塞问题。此外,由于工作线程只处理I/O完成,而不是等待I/O操作,因此它们可以快速响应,提高整体性能。 在设计...
在阻塞模式下,当调用`recv`或`send`函数时,如果数据未准备好,函数会挂起当前线程,直至数据可用。这种方式简单易用,但在多连接或并发处理时可能导致性能问题,因为线程可能会被长时间阻塞,造成资源浪费。为了...
客户端会通过Connect函数连接到服务器,并进行数据的发送和接收。 - 异步IOCP客户端:虽然这里没有提供具体实现,但理论上客户端也可以利用IOCP模型进行异步的网络通信,以提高效率。 6. 数据传输: 一旦服务器和...
- 发送和接收数据,使用`send`和`recv`函数。 - 关闭Socket,调用`closesocket`函数。 - 最后,调用`WSACleanup`清理Winsock库。 2. UDP Socket:UDP不保证数据的顺序或完整性,但具有更低的延迟,适合实时应用...
4. 接收数据:使用`WSARecv`异步接收数据。 5. 关闭连接:在完成通信后,关闭套接字和完成端口。 IOCP模型在高并发场景下表现优秀,如网络游戏、文件服务器、数据库服务器等,因为它能有效利用系统资源,提高系统...
Socket是计算机网络中的一个接口,它允许应用程序通过网络发送和接收数据。在C++中,我们通常使用套接字库(如Berkeley Sockets)来创建和操作socket对象。`#include <sys/socket.h>` 和 `#include <netinet/in.h>` ...
4. 接收数据,使用WSARecv函数异步接收服务器发送的数据。 在Vc6下编译并通过的CSSocket代码,可以在Windows 2003、98以及XP等操作系统下正常运行。这意味着它兼容了多种不同的Windows版本,具有较好的兼容性。 在...
- 使用WSASend发送数据,WSARecv接收数据,同样利用IOCP异步处理。 五、实验注意事项 在实验过程中,需要注意以下几点: - 异步I/O可能导致数据乱序,需要设计合理的数据包格式和顺序确认机制。 - 线程池的管理,...
- **客户端实现**:如何创建一个简单的TCP或UDP客户端,连接到指定的服务器并发送/接收数据。 - **服务器实现**:如何构建一个能够处理多个并发连接的服务器,包括连接管理、数据处理和资源释放。 这些源代码实例...
3. `WSABUF` 结构体:在发送和接收数据时,`WSABUF`结构体用于封装缓冲区的地址和长度。在使用`send`或`recv`函数时,可以传递一个`WSABUF`数组来处理多个数据块。 4. `WSAOVERLAPPED` 结构体:在异步编程中,这个...
- `WSARecv`函数用于从一个或多个套接字接收数据。这个函数是异步的,允许应用程序同时处理多个套接字的数据接收,提高了效率。 - 它可以接收部分数据包,这意味着如果一个数据包比接收缓冲区大,`WSARecv`可以只...
### Socket中的Send与Receive函数详解 在网络编程领域中,数据的发送与接收是核心操作之一。...在接收数据时,可能需要增加超时控制等功能。希望本篇文章能够为读者在网络编程的学习道路上提供一定的帮助。
1. FD_READ事件:表示套接字可读,此时可以通过recv或WSARecv等函数接收数据。在DoCallBack中,如果FD_READ事件发生,会尝试通过IOCtl(FIONREAD)获取可读字节数,然后调用OnReceive处理数据接收。 2. FD_WRITE事件...
故不能取到自己的ip和端口) <br>5、增加Toolbar,方便使用 <br>6、增加自动开缓冲功能(普通模式在一些特殊应用网络数据量很大时,列表内的数据可能会丢失,此功能可避免此问题) <br> 2006.4.6(VER:...