如何在没有标题的TCP协议中使用boost :: asio来告诉我消息的大小?

时间:2013-09-25 08:49:49

标签: c++ sockets tcp protocols boost-asio

Boost chat server example演示了如何处理一个简单的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

1 个答案:

答案 0 :(得分:1)

选项很少:

  • 您可以使用 async_read_until 进行阅读,直至“结束” 序列“(所以直到消息结束)。

  • 如果您的“结束序列”取决于 在“起始序列”上,你可以使它读取固定缓冲区(相等 开始序列长度);计算结束顺序;然后 设置 async_read_until

  • 此外,您可以调用 async_read_some 来读取到达套接字缓冲区的任何字节数。然后使用您自己的函数检查缓冲区以包含完整数据包或需要阅读下一部分。