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

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

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 (который установлен по умолчанию) предотвращает возврат resolve, если устройство замыкания на себя является единственным с адресом. Я все еще публикую это вопрос в надежде, что он поможет кому-то другому, но я решил свою проблему.

теперь я использую

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

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

2 ответов


проблема заключалась в том, что конструктор запроса по умолчанию имеет флаг 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 в качестве имени службы.