gpt4 book ai didi

c++ - 使用 boost 的 boost::asio::read 直接写入 cout

转载 作者:行者123 更新时间:2023-11-30 05:11:14 26 4
gpt4 key购买 nike

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

查看 Live On Coliru 它打印自己从 netcat 读取的源代码的地方。

使用套接字

如果您必须使用现有的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;
}

使用复制:

Live On Coliru

#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);
}

关于c++ - 使用 boost 的 boost::asio::read 直接写入 cout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45156077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com