Как работает разрешение имени хоста в Boost Asio в Linux? Можно ли использовать NSS?

Я пытаюсь заставить мое сетевое приложение работать локально (с сервером и клиентом, работающими на одном компьютере), когда нет сетевого подключения. Иногда кажется, что это «просто работает», но в большинстве случаев я получаю:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'
       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);

Хотя другим людям может не понадобиться флаг, который я использую, если они действительно хотят имена служб поиска (я просто использую номера портов).

8
задан Robert Harvey 11 May 2011 в 22:17
поделиться