当Socket.BeginReceive()分配的回调获得一些字节时,知道我有整个消息的最佳方法是什么?我应该在每个消息的前4个字节中保留消息的长度吗?
我在每条消息中发送一个XML文件,因此没有可用作消息分隔符的唯一字符。
答案 0 :(得分:2)
遵循您使用的协议的规范。如果它是原始协议,请编写规范。这是一项额外的工作,但它非常值得。
在该规范中,您可以指定消息长度。您还可以禁用有效内容中的特定字节(您可以使用零)并将其用作消息分隔符。由于您使用的是XML,因此您只需定义一个指示消息的标记 - 该标记的关闭将指示完整的消息。
这取决于你。但是要花时间详细说明您的协议。我向你保证会得到回报。
答案 1 :(得分:1)
我会使用包含两个整数的标头(每个4个字节)。第一个表示协议版本,第二个表示消息长度。使用标头长度而不是分隔符的好处是可以在开始解析之前为整个消息分配缓冲区。
使用版本整数作为第一个标题,您可以在任何较新版本的协议中更改其余标题和正文。
更新回复评论
标题中的版本号与实际消息中的版本号之间存在差异。消息版本用于文档,但标题版本用于协议本身。通过使用协议版本,您可以将消息传输从XML切换到Protobuf或消息的其他内容。您还可以添加标识实际消息目标的标题。