如何将 boost::asio::tcp::io_stream 附加到我的 io_service?
Posted
技术标签:
【中文标题】如何将 boost::asio::tcp::io_stream 附加到我的 io_service?【英文标题】:How to attach a boost::asio::tcp::io_stream to my io_service? 【发布时间】:2018-03-20 13:56:54 【问题描述】:我习惯于使用boost::asio::ip::tcp::socket
s,我将construct 与io_service
结合使用。这很有用,因为我对所有套接字都有一个 io_service
,并且这些套接字共享一个线程池。
现在,我正在尝试使用boost::asio::ip::tcp::io_stream
,我希望它在同一个线程池中执行所有异步工作。但是,似乎无法将construct 与tcp::io_stream
与外部io_service
联系起来。底层套接字确实使用了内部初始化的 io_service。有没有办法让我继续使用集中管理的io_service
和tcp::io_stream
?
我使用的是 boost 1.62 版。
【问题讨论】:
【参考方案1】:您可以将boost::asio::ip::tcp::socket
对象设置到流缓冲区中:
Live On Coliru
#include <boost/asio.hpp>
namespace ba = boost::asio;
using ba::ip::tcp;
int main()
ba::io_service svc;
tcp::socket s(svc);
// e.g. connect to test service
s.connect(, 6767);
tcp::iostream stream;
stream.rdbuf()->socket() = std::move(s);
for (std::string line; getline(stream, line);)
std::reverse(line.begin(), line.end());
stream << line << std::endl;
当运行在端口 6767 上的 netcat 会话时:
This is
Not so bad
After all
收到的回复是:
si sihT
dab os toN
lla retfA
【讨论】:
不确定为什么这是公认的答案,因为在 1.66 版之前的basic_socket_streambuf
中没有 socket()
方法。
@empty'void 有趣 :) 也许 OP 升级了。以上是关于如何将 boost::asio::tcp::io_stream 附加到我的 io_service?的主要内容,如果未能解决你的问题,请参考以下文章