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

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

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

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

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

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

    最佳答案

    您可以轻松发送任何 std 流,因此您也可以发送 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 作为虚拟对象):
    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++?

    关于c++ - 如何手动将数据放入 boost::asio::streambuf 以便稍后使用 std::istream 读取?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6363088/

    10-12 01:27