recv读取不完整的数据包

时间:2015-05-21 08:06:53

标签: c++ sockets visual-c++ recv

我有简单的功能,负责通过套接字接收数据包。

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

我发现有时候我会收到不完整的数据包。为什么? Mybe我应该多次使用recv?数据包长度永远不会超过50000字节。

我使用TCP套接字。

1 个答案:

答案 0 :(得分:4)

如果您正在使用TCP,那么这是预期的。 TCP是流式协议,它没有"数据包"或消息边界,您可以收到所有"消息"或者它的一部分,甚至是多条消息。因此,您可能需要多次致电{{1}}才能收到完整的消息。

但是,由于TCP没有消息边界,您必须在TCP之上自己实现它们,例如通过在固定大小的头中发送消息的长度,或者具有一些特殊的结尾 - 消息标记。