我正在编写多线程TCP服务器,根据应用程序设计,我需要为每个线程提供多个io_service
的线程。
使用该设计,我需要接受来自一个Thread/io_service
的连接进行身份验证过程(基于应用程序逻辑),然后将接受的连接传输到另一个Thread/io_service
以开始从经过身份验证的连接中读取长数据。
所以问题是how transfer accepted connection from one io_service into another one
?
这有什么标准功能吗?
由于
答案 0 :(得分:1)
根据一般想法回答。伪代码:
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
}
我只是希望这就是你要找的东西。
答案 1 :(得分:0)
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);
答案 2 :(得分:-1)
以下是有关如何执行此操作的小演示: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.