使用 boost 的 boost::asio::read 直接写入 cout。
Write directly to cout using boost's boost::asio::read
所以只是为了好玩,我想知道是否可以直接写入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
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- std::cout.imbue()多重调用
- 基于boost的程序的静态链接——zlib问题
- 使用 boost 的 boost::asio::read 直接写入 cout。
- boost库的哪一部分使cout能够打印wstring以及如何打印?
- 如何通过 boost::iostreams 管道进入 std::cout
- boost::scoped_lock 似乎没有锁定 std::cout
- boost::asio 在从串行端口读取时阻止 std::cout
- 带有boost::any的cout地图
- Boost 测试框架与 std::cout 的等效性是什么?
- 如何在使用boost.test时在eclipse IDE控制台中显示std::cout
- 当我们使用 cout 时,boost::any 和 boost::variant 之间的区别<<
- "cout&endl"和"boost"有什么问题?