什么取代了 asio::tcp::resolver::query?

问题描述 投票:0回答:2

我目前正在尝试构建一个不使用任何已弃用方法的项目,但遇到了解析器问题。我的旧代码曾经是这样的:

const asio::ip::tcp::resolver::query query(params.host, std::to_string(params.port));
      m_resolver.async_resolve(query, [&](const std::error_code &ec_, asio::ip::tcp::resolver::iterator iter) {
        if (ec_) {
          ec = ec_;
          return;
        }
        while (iter != asio::ip::tcp::resolver::iterator()) {
          m_socket.reset(new asio::generic::stream_protocol::socket(m_service));
          m_socket->async_connect((*iter++).endpoint(), [&](const std::error_code &err_code) {
            if (err_code) {
              ec = err_code;
              return;
            }
            connected = true;
          });
        };
      });

但现在 Asio 说 asio::tcp::resolver::query 已弃用。现在主机名解析是如何完成的?

c++ c++11 boost-asio
2个回答
3
投票

没有什么可以取代它。只需查看 [async_]resolve

 文档即可了解如何使用:

基本上,“参数对象”被“内联”以分隔参数。


0
投票

确实很混乱。但是

resolve()
作为几个重载,其中一些已被弃用,而一些重载则未被。甚至 Asio / Boost Asio 存储库中的示例仍在使用已弃用的查询。这当然无助于采用。

为了完整起见,这可能是使用 Asio 库(非 boost 版本)的新方法:

asio::io_context io_context;
std::string hostname, protocol;

// Resolve host
asio::ip::tcp::resolver resolver(io_context);
asio::ip::basic_resolver<asio::ip::tcp>::results_type result = resolver.resolve(hostname, protocol);
// Connect
asio::ip::tcp::socket socket(io_context);
asio::connect(socket, result);

希望这对其他人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.