【问题标题】:std::runtime_error: resolve: Host not found (authoritative) in boost::asiostd::runtime_error: 解决:在 boost::asio 中找不到主机(权威)
【发布时间】:2018-04-29 18:27:22
【问题描述】:

以下代码:

using boost::asio::ip::tcp;

std::string ipAddress;

boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query(boost::asio::ip::host_name(), "");

tcp::resolver::iterator iter = resolver.resolve(query);

使用 Xcode 9.1 在 OS X High Sierra 上运行时会导致以下错误:

std::runtime_error: resolve: Host not found (authoritative)

resolver 的值为:

(boost::asio::ip::tcp::resolver) resolver = {
  boost::asio::basic_io_object<boost::asio::ip::resolver_service<boost::asio::ip::tcp>, false> = {
    service = 0x00000001023159a0
    implementation = nullptr {
      __ptr_ = 0x0000000000000000
      __cntrl_ = 0x00000001023156c0
    }
  }
}

query的值为:

(boost::asio::ip::basic_resolver<boost::asio::ip::tcp, boost::asio::ip::resolver_service<boost::asio::ip::tcp> >::query) query = {
  hints_ = {
    ai_flags = 1024
    ai_family = 0
    ai_socktype = 1
    ai_protocol = 6
    ai_addrlen = 0
    ai_canonname = 0x0000000000000000
    ai_addr = 0x0000000000000000
    ai_next = 0x0000000000000000
  }
  host_name_ = "iMac.local"
  service_name_ = ""
}

resolve 函数如下所示:

iterator resolve(const query& q)
{
  boost::system::error_code ec;
  iterator i = this->service.resolve(this->implementation, q, ec);
  boost::asio::detail::throw_error(ec, "resolve");
  return i;
}

所以我可以看到调用resolveresolver.implementationnullptr 是导致问题的原因。但是,我不知道为什么它是nullptr

这在运行 OS X Yosemite 或 El Capitan 的不同机器上不是问题。

【问题讨论】:

  • boost::asio::ip::host_name() 返回什么?它是有效的主机名还是 IP 地址?如果你想连接到本地主机,为什么不简单地使用"127.0.0.1"
  • 返回iMac.local
  • 如果我只想知道机器的IP地址是什么?
  • 您的本地地址总是 127.0.0.1。本地环回接口的标准地址。
  • 你试过pinghost_name返回的主机吗?也许它只是没有正确设置?

标签: c++ macos boost boost-asio resolve


【解决方案1】:

发布答案以防其他人遇到同样的问题并在这里结束。

终于弄明白了,部分感谢一些程序员老兄询问有关 ping 主机然后根据 ping 失败的事实进行搜索。

这篇帖子https://discussions.apple.com/thread/7707202?start=0&tstart=0 指出,出于某种原因,除非任何共享服务处于活动状态,否则 .local 主机名会一直处于关闭状态。

打开它们可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 2021-09-26
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2013-12-23
    相关资源
    最近更新 更多