2016-02-06 24 views
0

我有一个websocket服务器,我用C++构建,目前用作基本的聊天服务器。现在Websockets有时发送不完整的数据

Binary: 10000001 10000010 10110110 00100110 01100101 01100011 11011110 01001111 
Byte size: 8 
Decoded: hi 

但每然后它不会发送完整的消息:

如果我发送一个基本的“喜”消息中的数据会喜欢这个。这种情况的一个例子是如下:

Binary: 10000001 10000010 01110111 00100010 11011011 
Byte size: 5 

它发送正确的数据,但它几乎一样,如果它已经在半完全切断。

我recieving代码看起来是这样的:

while (true) 
{ 
    char buffer[BUFFER_LENGTH] = ""; // (1024) 

    recv(*mSocket, buffer, BUFFER_LENGTH, 0); 

    // Data decoding code 
    // ... 
} 

我的TCP的理解是,协议本身将确保所有的数据包到达目的地。有人可以解释为什么我有数据丢失?

+2

您确定错误位于接收端而不是发送端吗?此外,TCP套接字是*流*,没有固定的数据包边界,这意味着一个'recv'调用可以接收少于完整的消息,并且您需要在循环中调用'recv'直到您收到完整的消息。这就是为什么建立在TCP之上的协议通常有一个精心指定的头部,通常包含有效负载的长度。 –

+2

TCP是基于流的,所以你不会确切地知道每次你接收到你的协议消息。可能有两条消息,或者一条消息 - 在这种情况下,如果你再次接受,你会得到下半场。也可能是您的C++服务器在发送每条消息后不刷新。 – Kenney

+0

啊,对。我明白了,谢谢。那一定是这样,我只是一次调用它。 – user1157885

回答

0

首先,确保客户端正在冲洗。

其次(如果我理解你的问题),而WebSocket是使用Socket实现的,请注意WebSocket不是Socket。您不能仅仅使用服务器中的TCP套接字调用来从WebSocket客户端检索数据。有每个WebSocket send()发送的WebSocket成帧数据。服务器检查传入的字节流,并在WebSocket框架的适当区域查找“消息数据”。另外,WebSocket数据可能不需要在一个WebSocket框架中发送;您还需要检查帧以查看是否需要检查另一个WebSocket帧以完成“消息数据”。请参阅IETF规范中的WebSocket协议:https://tools.ietf.org/html/rfc6455