如何告诉TCP服务器特定消息已经结束?

时间:2012-01-07 11:17:00

标签: sockets networking tcp network-programming network-protocols

TCP客户端逐字节发送数据。那么,如何告诉服务器此消息已经结束并且新消息现在开始了?

一种方法是修复一个特殊字符,它将作为书签发送,但该字符也可能是导致混淆的消息的一部分。

还有其他最佳出路吗?

4 个答案:

答案 0 :(得分:1)

一种可能的方法是,在发送实际消息之前,您可以发送特定消息中的字节数。当接收方已收到该字节数时,它可以开始接收下一条消息

答案 1 :(得分:1)

如果您希望将字符用作消息标记的结尾或作为消息的一部分,则需要使用转义序列。

例如:使用字符“$”结束消息,使用“%”转义

%$ -> $
%% -> %

然后使用'$'结束消息

所有或者发送消息开始时要接收的字节数(如果你不知道那一点完整消息的长度,则发送消息块)。

答案 2 :(得分:1)

如果消息是二进制,则无法使用特殊字符进行分隔编码。标签长度值(TLV)编码最适合此。

例如

 +--------+----------+----------------+    
 |  Tag   | Length   |  Content       |    
 | 0x0001 |  0x000C  | "HELLO, WORLD" |    
 +--------+----------+----------------+

除此之外,您还可以拥有多种消息类型

答案 3 :(得分:1)

查看开源通信框架networkComms.net中使用的实现。特别是第892行的{InmpackPacketHandleHandOff()here

它保证收到的第一个字节指定数据包标头的大小(小于255个字节)。一旦接收到足够的字节以重建报头,就可以检查报头以确定要接收的剩余大小(数据部分)。如果传入的字节数多于预期的标题和数据部分,则查看第一个字节并重新开始。

使用带书签的字符是在网络堆栈的基础级别使用的,但必须小心实施,以避免进一步的复杂化。