【问题标题】:How to attach a boost::asio::tcp::io_stream to my io_service?如何将 boost::asio::tcp::io_stream 附加到我的 io_service?
【发布时间】:2018-03-20 13:56:54
【问题描述】:

我习惯于使用boost::asio::ip::tcp::sockets,我将constructio_service 结合使用。这很有用,因为我对所有套接字都有一个 io_service,并且这些套接字共享一个线程池。

现在,我正在尝试使用boost::asio::ip::tcp::io_stream,我希望它在同一个线程池中执行所有异步工作。但是,似乎无法将constructtcp::io_stream 与外部io_service 联系起来。底层套接字确实使用了内部初始化的 io_service。有没有办法让我继续使用集中管理的io_servicetcp::io_stream

我使用的是 boost 1.62 版。

【问题讨论】:

    标签: c++ boost asio


    【解决方案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 升级了。
    猜你喜欢
    • 2015-04-22
    • 1970-01-01
    • 2011-06-16
    • 2017-09-17
    • 2013-08-07
    • 2012-11-26
    • 2011-12-18
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多