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