如何将 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::sockets,我将construct 与io_service 结合使用。这很有用,因为我对所有套接字都有一个 io_service,并且这些套接字共享一个线程池。

现在,我正在尝试使用boost::asio::ip::tcp::io_stream,我希望它在同一个线程池中执行所有异步工作。但是,似乎无法将construct 与tcp::io_stream 与外部io_service 联系起来。底层套接字确实使用了内部初始化的 io_service。有没有办法让我继续使用集中管理的io_servicetcp::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?的主要内容,如果未能解决你的问题,请参考以下文章

如何将正文内容与多个页面的固定页眉和页脚分开

如何将参数传递给函数的 __code__?

如何将对象转换为字典?

如何将小部件尺寸传递给 __init__

如何将下拉列表视图项目拖放到另一个列表视图

如何将 __init__ 参数传递给使用 qmlRegisterType 注册的类?