1

Boost聊天服务器示例演示了处理一个简单的 TCP 消息协议,其中每条消息前面都有一个固定大小的标头,它告诉您后面的消息的大小。async_read()这意味着您始终知道在下次调用;时要读取多少字节。您交替读取大小始终相同的标头和标头中给出大小的消息。这适用于 Boost i/o 服务模型,该模型承诺在从套接字接收到预期的字节数时调用处理程序。

如何使用 Boost 运行不使用这样的标头的 TCP 协议?我的客户端有一个协议,它使用特殊的字节序列来表示每条消息的开始和结束,所以我不知道每次调用要读取多少字节async_read();我必须在它们到达时从套接字获取字节并注意特殊的字节序列。如果我选择一个合理的缓冲区大小,比如 256 字节,并且如果我的处理程序仅在读取了这么多字节时才被调用,我相信 i/o 服务通常最终会从网络,但不会将它们传递给我的处理程序,直到下一条消息出现并将字节总数提高到我期望的数字。下一条消息可能有一段时间没有到达,我想在当前消息到达时立即处理它。

出于性能原因,一次读取一个字节不是一个好主意,对吗?

http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/examples.html

4

1 回答 1

1

有几个选项:

  • 您可以使用async_read_until读取直到您的“结束序列”(所以直到消息结束)。

  • 如果你的“结束序列”依赖于“开始序列”,你可以让它读取固定缓冲区(等于开始序列长度);计算结束序列;然后设置async_read_until

  • 此外,您可以调用async_read_some来读取到达套接字缓冲区的任意数量的字节。然后用你自己的函数检查你的缓冲区是否包含完整的数据包或需要阅读下一部分。
于 2013-09-25T10:08:18.423 回答