如何分隔TCP套接字消息

时间:2010-12-05 21:40:28

标签: vb.net sockets tcp

我在两个程序之间尝试了一些异步TCP套接字消息,用于传递数据,数字和/或文本。我所做的是在每条消息的开头使用一个关键字,然后用“|”分隔值。字符。所以消息可能如下所示:

“DATA | 490 | 40517.9328222222 | 1 | 6 | 11345 | 11347 | 11344 | 11345 | 106 | 40517.8494212963”

我将读取缓冲区大小设置为1024,因为大多数消息都在该长度内。然而,有时我可能会快速发送许多短消息,其中几个小于1024个字符,似乎它将一次性读取。如果我发送的邮件超过1024个字符,它将被拆分。所以我正在寻找一些如何处理这个问题的建议。我应该使用一些特殊字符来开始和/或结束每条消息吗?非常感谢您如何做到这一点。

6 个答案:

答案 0 :(得分:5)

最简单的方法是在每条消息的开头发送消息长度,以这样的方式进行序列化,使其可以在little-endian和big-endian硬件上运行。

这可以帮助您的接收器有效地预分配其接收缓冲区。

答案 1 :(得分:3)

最简单的方法是在数据包开头发送消息的大小。这样您就可以知道要读取多少数据。所以它看起来像:

00015MESSAGE|1|2 ...

尺寸字段具有固定尺寸非常重要。

您也可以将此大小字段设为二进制,但似乎您正在发送纯文本,因此您可以使用人工可读的大小字段。

答案 2 :(得分:2)

有几种方法。

  1. 每条消息前缀的长度字。

  2. 每条消息的STX / ETX样式包装,以便您可以查看它的开始和结束位置。这需要转义数据中出现的ETX字​​节,这反过来又需要转义ESC字节。

  3. 自描述协议,例如XML或基于类型长度值的协议。

答案 3 :(得分:1)

协议就是一切。对于我的聊天应用程序,我使用参数协议,就像你运行

时一样
shutdown.exe -s -f -t 30

但是对于套接字我使用这个

join John%20Doe            ' %20 for space
msg This%20Is%20a%20test   ' again %20 for space

这样,无论您的数据是否发送ASYNC都无关紧要:D希望这有助于

答案 4 :(得分:0)

您可以通过将具有唯一字节(如255中未出现在ASCII中)的消息填充到缓冲区大小并在接收端取消填充它们来解决该问题。 对我来说,这不是一个非常好的和聪明的解决方案,但它确实有效。

或者您可以尝试在每个程序包的开头发送整个数据包长度,这是一个更具挑战性的littile,并且当正确完成填充技术时效率更高。 然后合并的包看起来像这样(方案):

05|.....02|..03|...

答案 5 :(得分:0)

TAR的做法是使用固定大小的块。 TAR中的每个块都是512字节,文件(消息)可以完全包含在该块中。如果不是,前512个字节包含一个标题,指定需要为该文件读取多少个附加块(消息)。

Tar显然不是TCP应用程序,但它具有类似的数据解析或处理要求。

此外,您的大小小于512字节,但是包含64字节块或128或其他任何内容可能是有意义的,并将所有数据发送到该大小的包中。你会因为“盒子大小”的开销而失去效率,但你可能会获得数据处理算法的效率和简单性。