c++ - 从 Boost 1.73+ Asio 中的套接字获取 io_context 引用
问题描述
如何boost::asio::io_context
从套接字获取参考?以前有socket::get_io_service
然后是socket::get_io_context
成员函数,但是现在它们都被弃用了。我在 Boost 1.73+ 中找到了这样做的唯一方法:
boost::asio::ip::tcp::socket socket(...);
// ...
boost::asio::io_context& io_context = static_cast<boost::asio::io_context&>(socket.get_executor().context());
这可行,但看起来丑陋和危险。有没有更好的办法?
解决方案
您可能想要获取执行程序,它可能不是 io_context。
可以get_executor()
直接调用:
boost::asio::io_context io;
boost::asio::ip::tcp::socket s(io);
auto ex = s.get_executor();
executor 将允许您执行您可能使用io_context
for 的大多数事情。
更新
对于评论,我不建议依赖您通过任何服务对象传入的执行程序的确切目标,但如果您现在真的不想更新您的设计,您可以强制您的手:
#include <boost/asio.hpp>
int main() {
boost::asio::io_context io;
boost::asio::ip::tcp::socket s(io);
auto ex = s.get_executor();
auto* c = ex.target<boost::asio::io_context>();
boost::asio::ip::tcp::socket more_sockets(*c);
assert(c == &io);
}
组合异步操作时,您可以使用从处理程序派生执行程序boost::asio::get_associated_executor()
推荐阅读
- r - 如何通过 shinyApp 调用位于我桌面上的应用程序?
- tensorflow - Tacotron 与 TensorFlow Lite
- java - 线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:23
- ruby-on-rails - 无法启动 Rails 控制台。错误的捆绑器版本(已安装)
- android - java.lang.IndexOutOfBoundsException:索引:2,大小:0 ArrayList Kotlin
- postgresql - 在 PostgreSQL 中组合 AND/OR 的条件的评估顺序是什么?
- database - Robotframework 的数据库库在西里尔字符的情况下返回问号 (?) 而不是实际字符
- android - 将当前活动解析为android studio中的函数
- javascript - 将日期时间从一个偏移量转换为另一个偏移量
- python - 无法在 Python 2.7 上导入 cElementTree