Как разрешение имени хоста 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 в качестве имени службы.