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

nca*_*sas 4 c++ boost boost-asio

我试图使用std :: istream作为数据源.我想在istream的流缓冲区中放置自定义二进制数据,以便以后可以从istream中检索它.

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

根据我从文档中理解的,步骤应该是:

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

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

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

seh*_*ehe 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);
Run Code Online (Sandbox Code Playgroud)

如果你已经有一个完全填充的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);
Run Code Online (Sandbox Code Playgroud)

方法来填充的IStream是例如ostream::write升压序列化binary_archive

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

请参阅如何通过C++中的boost套接字发送ostream?