如何提升Asio的主机名parsing在Linux上的工作? 是否可以使用NSS?

我试图使我的networking应用程序在本地工作(服务器和客户端在同一台计算机上运行),当没有networking连接时。 这似乎“偶尔工作”,但大部分时间我最终:

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上实现,或者我可能想要使用什么。 这似乎是同一个问题。 看来,只是不执行任何查找,只是使用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); 

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

Solutions Collecting From Web of "如何提升Asio的主机名parsing在Linux上的工作? 是否可以使用NSS?"

问题是查询的构造函数默认情况下设置了address_configured标志,如果回送设备是唯一具有地址的设备,则不会返回地址。 通过只设置标志为0或除address_configured以外的任何其他问题是固定的。 这是我现在成功使用的:

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

希望这可以帮助任何人在将来遇到这个问题。

查询的构造函数默认使用标记“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作为服务名称。