首页 > 解决方案 > 从 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());

这可行,但看起来丑陋和危险。有没有更好的办法?

标签: c++boostboost-asio

解决方案


您可能想要获取执行程序,它可能不是 io_context。

可以get_executor()直接调用:

boost::asio::io_context io;
boost::asio::ip::tcp::socket s(io);
auto ex = s.get_executor();

executor 将允许您执行您可能使用io_contextfor 的大多数事情。

更新

对于评论,我不建议依赖您通过任何服务对象传入的执行程序的确切目标,但如果您现在真的不想更新您的设计,您可以强制您的手:

住在科利鲁

#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()


推荐阅读