这是我的另一个问题的一个分支.如果你愿意,请阅读它,但没有必要.
基本上,我意识到为了在大型消息上有效地使用C#的BeginReceive(),我需要(a)首先读取数据包长度,然后准确读取多个字节或(b)使用数据包结束分隔符.我的问题是,这些都存在于协议缓冲区中吗?我还没有使用过它们,但是在文档中看起来似乎没有长度标题或分隔符.
如果没有,我该怎么办?我应该只构建消息,然后用长度标题/ EOP分隔符前缀/后缀吗?
您需要在协议中包含大小或结束标记.除了支持任意分解成单独数据包的不确定八位字节流(并且数据包也可以在传输中溢出)之外,基于流的套接字(TCP/IP)不构建任何内容.
一种简单的方法是每个"消息"具有固定大小的头部,包括协议版本和有效载荷大小以及任何其他固定数据.然后是消息内容(payload).
可选地,可以添加消息页脚(固定大小),校验和甚至加密签名(取决于您的可靠性/安全性要求).
知道有效负载大小允许您继续读取足以用于剩余消息的多个字节(如果读取以较少的完成,则对剩余字节执行另一次读取,直到收到整个消息为止).
有一个结束消息指示符也可以,但您需要定义如何处理包含相同八位字节序列的消息...
在派对上迟到的道歉.我是protobuf-net的作者,它是C#实现之一.对于网络使用,您应该考虑"[De] SerializeWithLengthPrefix"方法 - 这样,它将自动为您处理长度.源中有一些例子.
我不会详细介绍旧帖子,但如果您想了解更多信息,请添加评论,我会尽快回复您.