使用 boost 的 boost::asio::read 直接写入 cout。

Write directly to cout using boost's boost::asio::read

本文关键字:boost cout read asio 使用      更新时间:2023-10-16

所以只是为了好玩,我想知道是否可以直接写入cout的缓冲区。

给定示例:

boost::asio::read(socket,boost::asio::buffer(<buffer of cout>); "套接字"中的数据被读入缓冲流,它需要是 cout 的缓冲区。

是否可以在没有临时流对象的情况下写入 cout?

直接,就像零拷贝一样?仅当操作系统支持它时。

在某些符合 POSIX 标准的操作系统上,如果输出被重定向到实际文件,您可能能够使用sendfile系统调用来实际零拷贝流。

公平地说,它不会使用boost::asio::read(除非破解重载来调用::sendfile计数(。

您可能想要的是以最小的工作量和最小的临时内存开销复制流(这样,例如,接收 3GB 流不需要超过 1k 的内存(。

我建议boost::asio::ip::tcp::istreamboost::iostreams::copy.

简单

这是一个没有boost::iostreams::copy的版本:

#include <boost/asio.hpp>
#include <iostream>
using boost::asio::ip::tcp;
int main() {
tcp::iostream socket(tcp::endpoint {{}, 6767});
std::cout << socket.rdbuf() << std::flush;
}

Coliru 上看到它,它打印自己的来源 从netcat读取 .

使用socket

如果必须使用现有的tcp::socket实例,则可以:

#include <boost/asio.hpp>
#include <iostream>
using boost::asio::ip::tcp;
int main() {
boost::asio::io_service svc;
tcp::socket s(svc);
s.connect(tcp::endpoint {{}, 6767});
tcp::iostream stream;
stream.rdbuf()->assign(tcp::v4(), s.native_handle());
std::cout << stream.rdbuf() << std::flush;
}

使用copy

住在科里鲁

#include <boost/asio.hpp>
#include <boost/iostreams/copy.hpp>
#include <iostream>
using boost::asio::ip::tcp;
int main() {
tcp::iostream socket(tcp::endpoint {{}, 6767});
boost::iostreams::copy(socket, std::cout);
}

ASIOstreambuf的类是从 stdlibstreambuf派生的(子类型(。因此,以下代码段必须执行您想要执行的操作:

const int to_read_bytes = 512;
boost::asio::streambuf my_buffer;
std::cout.rdbuf(&my_buffer);
// It will print into cout's buffer the read bytes
size_t n = boost::asio::read(socket, my_buffer.prepare(to_read_bytes));
// This is important as it moves the output characters to the input sequence
my_buffer.commit(n);

链接

  • ASIO streambuf