如何将boost :: asio :: tcp :: io_stream附加到我的io_service?

Ste*_*art 5 c++ boost asio

我习惯使用boost::asio::ip::tcp::sockets来构建它们io_service.这很有用,因为我有一个单独io_service的所有套接字,这些套接字共享一个线程池.

现在,我正在尝试使用a boost::asio::ip::tcp::io_stream,我希望它在同一个线程池中执行所有异步工作.但是,似乎不可能用外部构造一个.底层套接字确实使用内部初始化的io_service.有我的方式继续使用我的集中管理有?tcp::io_streamio_serviceio_servicetcp::io_stream

我正在使用boost版本1.62.

seh*_*ehe 2

您可以将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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当在端口 6767 上运行 netcat 会话时:

#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

收到的回复是:

This is
Not so bad
After all
Run Code Online (Sandbox Code Playgroud)