boost :: asio не смог подключиться к локальному хосту без WLAN

На моем компьютере (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());
}

И сообщение об ошибке было: запрошенное имя является действительным, но нет данных
запрошенного типа был найден.

Пинг до локального хоста в порядке.

Я чувствую себя озадаченным, нужна ли локальная сетевая программа Интернет?
Нужна ли для локальной сетевой программы сетевой адаптер?
Почему пинг работает нормально?

7

Решение

У меня просто была такая же проблема на машине с 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.

6

Другие решения

У меня нет объяснения, почему у вас есть эта ошибка. Однако в проекте я не указывал номер порта напрямую, а строил экземпляр конечной точки в два этапа. Я не помню обоснования того времени, чтобы сделать это таким образом, но это может помочь вам.

Мое предлагаемое решение выглядит примерно так:

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);

Это обобщенный отрывок из того, что я сделал, поэтому он может не скомпилироваться как есть.

0

локальной сети не требуется интернет для работы. В вашем случае, я не знаю точно, проблема уровня Windows TCP / IP с разрешением localhost когда он не имеет конфигурации DNS-сервера (сетевая карта не подключена, и т. д.). Но вы можете использовать tcp::resolver::query query("127.0.0.1", "10127"); вместо tcp::resolver::query query("localhost", "10127");
который работает всегда.

0
По вопросам рекламы [email protected]