【问题标题】:How does Boost Asio's hostname resolution work on Linux? Is it possible to use NSS?Boost Asio 的主机名解析如何在 Linux 上工作?可以使用 NSS 吗?
【发布时间】:2011-05-11 22:13:08
【问题描述】:

当没有网络连接时,我正在尝试使我的联网应用程序在本地工作(服务器和客户端都在同一台计算机上运行)。这似乎偶尔会“正常工作”,但大多数时候我最终会得到:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
       what(): Host not found (authoritative)
    Aborted

我目前使用的代码是:

  tcp::resolver::query query(host, PORT);
  tcp::resolver::iterator endpointIterator = resolver.resolve(query);
  tcp::resolver::iterator end;

  boost::system::error_code error = boost::asio::error::host_not_found;
  while(error && endpointIterator != end)
  {
    mySocket.close();
    mySocket.connect(*endpointIterator++, error);
  }
  if(error)
    throw boost::system::system_error(error);

我很确定我已将问题范围缩小到ip::basic_resolver::resolve,但我无法弄清楚它是如何在 Linux 上实现的,或者我可能还想使用什么。 This 似乎是同一个问题。似乎根本不执行任何查找并且只使用 127.0.0.1 应该可以工作,但是当我尝试用

替换查询行时
tcp::resolver::query query(host, PORT, boost::asio::ip::resolver_query_base::address_configured | boost::asio::ip::resolver_query_base::numeric_host

没用。 在我写这篇文章时,我发现了我的错误,如果环回设备是唯一具有地址的设备,address_configured 标志(默认设置)会阻止解析返回。我仍在发布此问题,希望对其他人有所帮助,但我已经解决了我的问题。

现在我用

tcp::resolver::query query(host, PORT, boost::asio::ip::resolver_query_base::numeric_service);

虽然其他人可能不想要我使用的标志,但如果他们确实想要查找服务名称(我只是使用端口号)。

【问题讨论】:

    标签: linux networking boost-asio


    【解决方案1】:

    问题在于查询的构造函数默认设置了 address_configured 标志,如果环回设备是唯一具有地址的设备,则该标志不会返回地址。只需将标志设置为 0 或 address_configured 以外的任何内容,问题就得到了解决。 这是我现在成功使用的:

    tcp::resolver::query query(host, PORT, boost::asio::ip::resolver_query_base::numeric_service);
    

    希望这对以后遇到此问题的人有所帮助。

    【讨论】:

      【解决方案2】:

      查询的构造函数默认具有标志“address_configured”。

      ip::basic_resolver_query::address_configured

      仅在为系统配置了非环回 IPv4 地址时才返回 IPv4 地址。如果系统配置了非环回 IPv6 地址,则仅返回 IPv6 地址。

      虽然将标志设置为其他东西会起作用,但它也会产生上述标志的副作用。为避免这种情况,请使用枚举的“默认”。

      tcp::resolver::query query(host, PORT, boost::asio::ip::resolver_query_base::flags());
      

      过去可以只使用 0,但库变得更加严格,以防止意外使用 int 作为服务名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-06
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 2015-08-08
        • 1970-01-01
        • 2019-02-21
        相关资源
        最近更新 更多