我在两个程序之间尝试了一些异步TCP套接字消息,用于传递数据,数字和/或文本。我所做的是在每条消息的开头使用一个关键字,然后用“|”分隔值。字符。所以消息可能如下所示:
“DATA | 490 | 40517.9328222222 | 1 | 6 | 11345 | 11347 | 11344 | 11345 | 106 | 40517.8494212963”
我将读取缓冲区大小设置为1024,因为大多数消息都在该长度内。然而,有时我可能会快速发送许多短消息,其中几个小于1024个字符,似乎它将一次性读取。如果我发送的邮件超过1024个字符,它将被拆分。所以我正在寻找一些如何处理这个问题的建议。我应该使用一些特殊字符来开始和/或结束每条消息吗?非常感谢您如何做到这一点。
答案 0 :(得分:5)
最简单的方法是在每条消息的开头发送消息长度,以这样的方式进行序列化,使其可以在little-endian和big-endian硬件上运行。
这可以帮助您的接收器有效地预分配其接收缓冲区。
答案 1 :(得分:3)
最简单的方法是在数据包开头发送消息的大小。这样您就可以知道要读取多少数据。所以它看起来像:
00015MESSAGE|1|2 ...
尺寸字段具有固定尺寸非常重要。
您也可以将此大小字段设为二进制,但似乎您正在发送纯文本,因此您可以使用人工可读的大小字段。
答案 2 :(得分:2)
有几种方法。
每条消息前缀的长度字。
每条消息的STX / ETX样式包装,以便您可以查看它的开始和结束位置。这需要转义数据中出现的ETX字节,这反过来又需要转义ESC字节。
自描述协议,例如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或其他任何内容可能是有意义的,并将所有数据发送到该大小的包中。你会因为“盒子大小”的开销而失去效率,但你可能会获得数据处理算法的效率和简单性。