На моем компьютере (Surface Pro 2) есть только один сетевой адаптер,
это адаптер беспроводной локальной сети.
Я работал над небольшим проектом C ++, он использует повышение :: ASIO подключиться к
localhost и делай свою работу, все просто отлично.
Но сегодня я обнаружил, что если я отключу WLAN от Интернета,
эта программа не работает.
Исключение будет выдано преобразователем повышение :: ASIO :
tcp::resolver::query query("localhost", "10127");
tcp::resolver resolver(io_service_);
tcp::resolver::iterator iterator;
try {
iterator = resolver.resolve(query);
}
catch (boost::system::system_error& e) {
log(e.what());
}
И сообщение об ошибке было: запрошенное имя является действительным, но нет данных
запрошенного типа был найден.
Пинг до локального хоста в порядке.
Я чувствую себя озадаченным, нужна ли локальная сетевая программа Интернет?
Нужна ли для локальной сетевой программы сетевой адаптер?
Почему пинг работает нормально?
У меня просто была такая же проблема на машине с Linux, и я посмотрел документацию по boost asio. Вам просто нужно добавить аргумент флага к query
конструктор:
tcp::resolver::query query("localhost","10127",tcp::resolver::query::canonical_name);
Примечание: полное имя области query
является boost::asio::ip::tcp::resolver::query
,
Это происходит потому, что переданный здесь аргумент флагов по умолчанию boost::asio::ip::tcp::resolver::query::address_configured
Это означает, что вызов должен разрешать адреса IPv4 / IPv6 только в том случае, если для системы сконфигурирован адрес без обратной связи IPv4 / IPv6.
У меня нет объяснения, почему у вас есть эта ошибка. Однако в проекте я не указывал номер порта напрямую, а строил экземпляр конечной точки в два этапа. Я не помню обоснования того времени, чтобы сделать это таким образом, но это может помочь вам.
Мое предлагаемое решение выглядит примерно так:
ip::tcp::resolver::query query(ip::tcp::v4(), "localhost", ""); // empty service name
tcp::resolver::iterator it_endpoint = resolver.resolve(query);
ip::tcp::endpoint endpoint(ip::tcp::endpoint(*it_endpoint).address(), port);
Это обобщенный отрывок из того, что я сделал, поэтому он может не скомпилироваться как есть.
локальной сети не требуется интернет для работы. В вашем случае, я не знаю точно, проблема уровня Windows TCP / IP с разрешением localhost
когда он не имеет конфигурации DNS-сервера (сетевая карта не подключена, и т. д.). Но вы можете использовать tcp::resolver::query query("127.0.0.1", "10127");
вместо tcp::resolver::query query("localhost", "10127");
который работает всегда.