当前位置:  开发笔记 > 编程语言 > 正文

如何检测何时完全接收协议缓冲区消息?

如何解决《如何检测何时完全接收协议缓冲区消息?》经验,为你挑选了2个好方法。

这是我的另一个问题的一个分支.如果你愿意,请阅读它,但没有必要.

基本上,我意识到为了在大型消息上有效地使用C#的BeginReceive(),我需要(a)首先读取数据包长度,然后准确读取多个字节或(b)使用数据包结束分隔符.我的问题是,这些都存在于协议缓冲区中吗?我还没有使用过它们,但是在文档中看起来似乎没有长度标题或分隔符.

如果没有,我该怎么办?我应该只构建消息,然后用长度标题/ EOP分隔符前缀/后缀吗?



1> Richard..:

您需要在协议中包含大小或结束标记.除了支持任意分解成单独数据包的不确定八位字节流(并且数据包也可以在传输中溢出)之外,基于流的套接字(TCP/IP)不构建任何内容.

一种简单的方法是每个"消息"具有固定大小的头部,包括协议版本和有效载荷大小以及任何其他固定数据.然后是消息内容(payload).

可选地,可以添加消息页脚(固定大小),校验和甚至加密签名(取决于您的可靠性/安全性要求).

知道有效负载大小允许您继续读取足以用于剩余消息的多个字节(如果读取以较少的完成,则对剩余字节执行另一次读取,直到收到整个消息为止).

有一个结束消息指示符也可以,但您需要定义如何处理包含相同八位字节序列的消息...



2> Marc Gravell..:

在派对上迟到的道歉.我是protobuf-net的作者,它是C#实现之一.对于网络使用,您应该考虑"[De] SerializeWithLengthPrefix"方法 - 这样,它将自动为您处理长度.源中有一些例子.

我不会详细介绍旧帖子,但如果您想了解更多信息,请添加评论,我会尽快回复您.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有