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