c++ - C++ `recv` 函数如何处理数据接收?它能收到部分 "packet"吗?

标签 c++ sockets count byte recv

static void HandlePackets(void* pParams)
{
   int iResult = 0;
   char recvbuf[MAX_PACKET_LENGTH];

   printf("Packet handling started\n");

   while((iResult = recv(lhSocket, recvbuf, MAX_PACKET_LENGTH, 0)) > 0)
      printf("Bytes received: %d\n", iResult);

   printf("Packet handling stopped with reason %i", WSAGetLastError());
}

目前,它只打印接收到的字节数。

会不会发生这样的事情,recv 只会收到一半的数据包?或者一个完整的数据包和下一个数据包的一半,如果服务器快速地一个接一个地发送它们?

例如,服务器发送了一个长度为 512 字节的数据包,是否有可能 recv 第一次收到 500 字节,然后第二次尝试接收剩下的 12 字节?

如果服务器发送大量数据包,每个数据包长度为 512 字节,recv 是否有可能在第一次执行时获得 700 字节,在第二次执行时获得剩余字节?

MAX_PACKET_LENGTH 为 1024

(我这里说的是应用层包,不是传输层。)

整个问题是——我是否需要为客户端提供某种可能性,将接收到的字节合并到一个数据包中,或者将过度接收的字节拆分到不同的数据包中?

最佳答案

Is it possible that recv first got 500 bytes, and the remain 12 will receive from second attempt?

是的,绝对是。

您无法保证,当发送端发送 X 字节的突发时,接收端会在一次调用 recv 中将它们全部接收。 recv 甚至不知道您的应用层“数据包” 中有多少字节。

The whole problem is - do I need to make some possibility for client to combine received bytes into one packet or split over-received bytes to different packets?

您的应用程序肯定必须从可能的顺序读取中累积数据、填充缓冲区并执行解析以查找完整的数据包。

TCP/IP 不知道您的应用程序的协议(protocol);正如 David 所说,如果您想将传入的数据流拆分为“数据包”,那么您必须自己做。

关于c++ - C++ `recv` 函数如何处理数据接收?它能收到部分 "packet"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275762/

相关文章:

ruby-on-rails - ruby 中的复杂计数

python - 无论元素顺序如何,获取列表中元组的数量

c++ - C/C++ 创建一个带有负值的枚举,而不必对其编号

C++ - 这个单独的编译代码有什么问题?

c++ - YouCompleteMe,头文件

java - 在没有 Apache 的情况下从 301 重定向获取 URL

c++ - Microsoft Visual Studio 2008 正在与其所依赖的项目并行构建依赖项目

c++ - 当我调用WSASend()时,所有数据都会被发送吗?

node.js - 我们可以在Socket.IO中将数据添加到房间吗

MySQL 具有不同结果长度的多个选择查询