【问题标题】:How to manually place data in a boost::asio::streambuf to later read it with a std::istream?如何手动将数据放入 boost::asio::streambuf 以便稍后使用 std::istream 读取它?
【发布时间】:2011-09-15 19:49:17
【问题描述】:

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

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

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

  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 步?

【问题讨论】:

  • @Xeo 这正是我想要做的,但使用二进制数据而不是文本。据我了解,字符串流是不可能的。我对吗?是否有任何其他流实现可以用于此?

标签: c++ boost boost-asio


【解决方案1】:

您可以轻松发送任何标准流,因此您也可以发送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++?

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 哇?这对我来说似乎是个有趣的建议
    • 我同意您提出的方法是可行的,但对我来说似乎有点矫枉过正。我的最终目的是对一段面向流的代码进行单元测试,除非真的有必要,否则我不希望涉及额外的软件元素。
    • 你已经加入了 boost::asio,所以它似乎适合你提出的框架。为什么不直接使用由任何streambuf 构造的std::iostream?它投射到 istream 就好了
    • 单元测试旨在单独测试一个小型软件组件(例如类、函数)。对我来说,使用网络连接作为测试的一部分打破了这种隔离
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多