上下文
首先是一些上下文:Boost.Asio 服务器接收格式如下的请求:
- XML 格式的 X 字节元数据
- X 字节的可选二进制数据
我们有一个采用 std::istream 的 XML 解析器,因此将 tcp::iostream 传递给这个函数真的很容易。接下来的二进制数据可能很重,因此我们应该异步读取数据包(例如 500ko),直到读取所有数据。
问题
我们可以先使用 tcp::iostream,然后使用带下划线的 socket_streambuf 的 async_read 吗?当然,编译是可以的,但是socket上的读操作是否正确使用了tcp::iostream的内部缓冲区呢? (即使在读取元数据之后,该值也可能不为空)。我想它应该尊重里氏替换原则,但我更愿意确定。
我们可以随时随地从一种方法切换到另一种方法吗?
最佳答案
最后我根本没有使用流。它们似乎易于使用/友好,但它们不允许异步操作。我意识到混契约(Contract)步和异步操作不是一个好主意。将异步操作添加到队列有助于平衡服务器的负载。结论:您应该只使用异步操作,因为 Boost.Asio 主要是为异步操作设计的。
关于c++ - 使用 Boost.Asio 进行混合 tcp::iostream 和套接字操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17629366/