如何手动将数据放在boost :: asio :: streambuf中以便稍后用std :: istream读取它?

时间:2011-06-15 19:22:35

标签: c++ boost boost-asio

我正在尝试使用std :: istream作为数据源。我希望自定义二进制数据放在istream的流缓冲区中,以便以后可以从istream中检索它。

我已经阅读过关于boost :: asio :: streambuf以及如何使用它来完成我想要的但是使用套接字作为数据源而不是内存缓冲区,这就是我想要使用的。 / p>

根据我对documentation的理解,步骤应为:

  1. 创建一个boost :: asio :: streambuf
  2. 创建一个传递streambuf的std :: istream
  3. 调用boost :: asio :: streambuf :: prepare获取表示输出序列的缓冲区列表。
  4. 以某种方式写入输出序列。
  5. 调用boost :: asio :: streambuf :: commit将我在输出序列中写的内容移动到输入序列。
  6. 通常使用std :: stream :: read。
  7. 从步骤2中的std :: istream中读取

    我不知道如何解决第4步,所以即使我朝着正确的方向前进,我也不知道。

    描述的步骤是否正确?如果是这样,如何解决第4步?

2 个答案:

答案 0 :(得分:6)

您可以轻松发送任何标准信息流,因此您也可以stringstream。您可以将二进制数据写入字符串流(它实际上只是一个字节数组)。

一些样本:

boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream.write(&binarydata_buf, sizeof(binarydata_buf));
// or use stream operators: request_stream << "xxx" << yyy;

// Send the request.
boost::asio::write(socket, request);

如果你已经有一个完全填充的istream(在这个例子中使用std :: cin作为dummy):

boost::asio::streambuf request;
std::ostream request_stream(&request);
request_stream << std::cin.rdbuf() << std::flush;

// Send the request.
boost::asio::write(socket, request);

填充istream的方法是例如ostream::writeBoost Serialization binary_archive

当然,有许多方法可以给猫皮肤,所以在盲目复制之前一定要考虑其他选项。

请参阅How to send ostream via boost sockets in C++?

答案 1 :(得分:0)

为什么不将数据通过套接字传输到streambuf?如果你可以将std :: istream链接到正在侦听特定套接字的asio :: streambuf,只需使用与boost :: asio :: write相同的套接字就可以发送数据。

使用实际套接字进程内部并没有太大的代价,而不是通过访问底层数据结构来模拟它。