Boost Asio将接受的套接字从一个io_service传输到另一个io_service

Boost Asio transfer accepted socket from one io_service to another io_service

本文关键字:io service 一个 另一个 传输 Asio 套接字 Boost      更新时间:2023-10-16

我正在编写多线程TCP服务器,其中基于应用程序设计,我需要为每个io_service拥有多个线程。

通过这种设计,我需要接受来自一个Thread/io_service的连接,进行身份验证过程(基于应用程序逻辑),然后将接受的连接传输到另一个Thread/io_service以开始从经过身份验证的连接中读取长数据。

那么问题是how transfer accepted connection from one io_service into another one ?

这有什么标准功能吗?

谢谢

根据大致思路回答。伪代码:

create_io_service_pool(...);
tcp::acceptor tcp_acceptor(accept_io_service, tcp::endpoint(tcp::v4(), 6069));
while (true) {
  auto csocket = tcp::socket(get_io_service_from_pool());
  tcp_acceptor.accept(csocket);
  /// Any async operation afterwords on csocket would be handled by the 
  /// io_service it got from `get_io_service_from_pool` function
  /// which you can design as you wish..may be round-robin one for simplicity
}

我只是希望这是你正在寻找的。

参见http://think-async.com/Asio/asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_accept/overload4.html

void accept_handler(const asio::error_code& error,
    asio::ip::tcp::socket peer)
{
  if (!error)
  {
    // Accept succeeded.
  }
}
...
asio::ip::tcp::acceptor acceptor(io_context);
...
acceptor.async_accept(io_context2, accept_handler);

这里是如何做到这一点的一个小演示:switch_io_context_for_socket_main.cpp(使用独立的ASIO)。

关键是使用socket::release +socket::assign:
tcp::socket sock1{ primary_io_context };
// ... accept/connect/do something with it 
// Switch it to another context:
tcp::socket sock2{ another_io_context };
sock2.assign( tcp::v4(), socket1.release() );
// work with sock2 which is bind to another context.