我正在尝试使用std :: istream作为数据源。我希望将自定义二进制数据放在istream的流缓冲区中,以便以后可以从istream中检索它。
我已经阅读过关于boost :: asio :: streambuf以及如何使用它来完成我想要的但是使用套接字作为数据源而不是内存缓冲区,这就是我想要使用的。 / p>
根据我对documentation的理解,步骤应为:
我不知道如何解决第4步,所以即使我朝着正确的方向前进,我也不知道。
描述的步骤是否正确?如果是这样,如何解决第4步?
答案 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::write
或Boost Serialization binary_archive
当然,有许多方法可以给猫皮肤,所以在盲目复制之前一定要考虑其他选项。
答案 1 :(得分:0)
为什么不将数据通过套接字传输到streambuf?如果你可以将std :: istream链接到正在侦听特定套接字的asio :: streambuf,只需使用与boost :: asio :: write相同的套接字就可以发送数据。
使用实际套接字进程内部并没有太大的代价,而不是通过访问底层数据结构来模拟它。