【发布时间】:2016-02-06 15:43:30
【问题描述】:
我有一个用 C++ 构建的 websocket 服务器,目前用作基本的聊天服务器。
如果我要发送一个基本的“嗨”消息,数据会是这样的:
Binary: 10000001 10000010 10110110 00100110 01100101 01100011 11011110 01001111
Byte size: 8
Decoded: hi
但有时它不会发送完整的消息。这种情况的一个例子如下:
Binary: 10000001 10000010 01110111 00100010 11011011
Byte size: 5
它正在发送正确的数据,但它几乎就像被完全切成两半一样。
我的接收代码如下所示:
while (true)
{
char buffer[BUFFER_LENGTH] = ""; // (1024)
recv(*mSocket, buffer, BUFFER_LENGTH, 0);
// Data decoding code
// ...
}
我对 TCP 的理解是协议本身会确保所有数据包都到达目的地。有人可以解释为什么我会丢失数据吗?
【问题讨论】:
-
您确定错误出在接收方而不是发送方吗?此外,TCP 套接字是流式传输,没有固定的数据包边界,这意味着单个
recv调用可以接收不到完整的消息,并且您需要循环调用recv直到您收到一个完整的消息。这就是为什么构建在 TCP 之上的协议通常具有明确指定的标头,该标头通常包含有效负载的长度。 -
TCP 是基于流的,因此您无法确定每次
recv都会收到您的协议消息之一。可能有两条消息或半条消息——在这种情况下,如果您再次recv,您将获得下半部分。也可能是您的 C++ 服务器在发送每条消息后没有刷新。 -
啊,对。我明白了,谢谢。一定是这样,我只调用一次。