Recv读取不完整数据包

recv reads incomplete packet

本文关键字:整数 数据包 读取 Recv      更新时间:2023-10-16

我有一个简单的函数,负责通过套接字接收数据包。

if((recv_size = recv(sock , rx , 50000 ,0)) == SOCKET_ERROR)
  {
    ...                         
  } else
  {
    ...
  }

我发现有时我收到不完整的包。为什么?也许我应该多次使用recv ?报文长度不能超过50000字节。

如果您使用TCP,这是预期的。TCP是一个协议,它没有"数据包"或消息边界,您可以接收所有的"消息"或部分消息,甚至多个消息。因此,您可能需要多次调用recv来接收完整的消息。

然而,由于TCP没有消息边界,你必须在TCP之上自己实现它们,例如通过在固定大小的头中发送消息长度,或者使用一些特殊的消息结束标记。