我正在编写一个客户端服务器模型应用程序,服务器通过流连接以非常高的速率向客户端发送大量消息(具有不同大小),客户端在比预期消息更大的缓冲区上读取这些消息大小
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-| ....(,,,什么都不是,只是为了格式化)
请注意,我必须使用流式连接并且我不喜欢在消息之间不使用任何分隔符
最佳答案
您无法控制流的字节如何传送到应用程序,它是一个字节流,而不是单个消息。
即使您不“喜欢”定界符,这也正是它们被如此频繁使用的原因。这不是一个有趣的想法,它是解决这个问题的基本方法。不“喜欢”它不是很有趣,因为反对意见。
除定界符外,您唯一的希望是实现消息解析,它可以始终正确地确定它是否有完整的消息,如果有,是哪条消息。如果消息是“前缀”;这样一个特定的字节序列 B 既可以是完整的消息 M1 又可以是 M2 的开始,那么我想你完蛋了。
关于c - 在 c 中的流式套接字上读取消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13932047/