1

我正在编写一个客户端服务器模型应用程序,服务器在与客户端的流连接上以非常高的速率发送大量消息(不同大小),客户端在大于预期消息大小的缓冲区上读取这些消息

while (ret = read (sd, buf, sizeof buf) > 0)
{
      // decode message here
}

这里的问题是客户端可能会像这样在缓冲区上读取多个消息,如果我假设缓冲区是 B 并且消息是 M#,它将收到如下消息

|----B----|----B----|----B----|----B----| ……

|-M1--|-M2-|--M3-|-M4-|---M5---|--M6-| ……

这使得消息的解码不正确。所以,我想接收如下消息(每个缓冲区只有一条消息)

|----B----|----B----|----B----|----B----| ……

|-M1--|,,|-M2-|,,,|--M3-|,,|-M4-| .... (,,, 什么都不是,只是为了格式化)

请注意,我必须使用流连接,并且我不喜欢在消息之间不使用任何分隔符

4

2 回答 2

3

您无法控制流的字节如何传递给应用程序,它是字节流,而不是单个消息。

即使您不“喜欢”分隔符,这也正是它们如此频繁使用的原因。这不是一个有趣的想法,它是这个问题的基本解决方案。不“喜欢”它不是很有趣,因为反对。

除了分隔符之外,您唯一的希望是实现消息解析,该解析可以始终正确确定它是否有完整的消息,如果有的话,是哪条消息。如果消息是“前缀”;这样一个特定的字节序列 B 既可以是完整的消息 M1 又可以是 M2 的开头,那么我认为你是敬酒。

于 2012-12-18T11:38:08.613 回答
1

分隔符有很多种。协议中“非法”的任何字符都将成为出色的分隔符,但如果您可以选择可打印的字符,则可以使协议在嗅探器或使用 telnet 时更具可读性。

基于 XML 或类似结构化数据的协议也是一种选择。这使得分隔符更加复杂。

二进制协议通常使用 TLV (http://en.wikipedia.org/wiki/Type-length-value),其中长度指定消息中的字节数(仅值部分或类型、长度和值两者)。

于 2012-12-18T13:29:33.310 回答