Boost Asio将接受的套接字从一个io_service传输到另一个io_service
Boost Asio transfer accepted socket from one io_service to another io_service
我正在编写多线程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.
相关文章:
- Seg Fault Issue C++ (file IO / getline)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- Agora.io 虚幻引擎插件构建错误
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 通过 Tor 服务C++ socket.io 客户端
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何读取 google::p rotobuf::io::CodedOutputStream::WriteVarint32
- Conan.io 在编译步骤中或已经在签出时
- C++中真正的异步文件 IO
- 在C++中返回 IO 对象的目的是什么?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- C++网络 IO、文件处理和网络故障
- Xcode OSX上的C++构建失败,出现多个错误文件IO..不可用:在macOS 10.15中引入
- Android Studio-在现有的旧项目中启用本机C++调试(card.io Android Source)
- 如何检测函数是否执行IO操作
- 如何键入用于const对象的自定义io操纵器
- libevent是否允许在不同的线程中运行timer/io的回调
- IO服务重新启动后,Boost最后期限计时器持续触发