我有简单的功能,负责通过套接字接收数据包。
if((recv_size = recv(sock , rx , 50000 ,0)) == SOCKET_ERROR)
{
...
} else
{
...
}
我发现有时候我会收到不完整的数据包。为什么? Mybe我应该多次使用recv
?数据包长度永远不会超过50000字节。
我使用TCP套接字。
答案 0 :(得分:4)
如果您正在使用TCP,那么这是预期的。 TCP是流式协议,它没有"数据包"或消息边界,您可以收到所有"消息"或者它的一部分,甚至是多条消息。因此,您可能需要多次致电{{1}}才能收到完整的消息。
但是,由于TCP没有消息边界,您必须在TCP之上自己实现它们,例如通过在固定大小的头中发送消息的长度,或者具有一些特殊的结尾 - 消息标记。