所以只是为了好玩,我想知道是否可以直接写入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::istream
boost::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