Python сокеты и обнаружение отсутствия подключения к интернету - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь выделить различные типы ошибок, которые могут возникнуть при использовании модуля Python sockets для выполнения интернет-запросов, чтобы я мог обработать их соответствующим образом.В частности, случай, когда нет доступа к интернету, который я хотел бы обработать, чтобы я мог проверить и дождаться доступности.

Запросы, с которыми я работаю, поступают через URL-адреса, в основе которых лежит функция socket getaddrinfo(), которая, прежде всего, разрешает имя хоста в IP.Для удаленных хостов это включает DNS-запрос, который, очевидно, не работает без Интернета, и, следовательно, является первой точкой отказа, если нет подключения к Интернету.

Однако, похоже, что getaddrinfo() вызывает одно и то же исключение как для «без интернета» (т. Е. Отправка запроса DNS не удалась или истекло время ожидания), так и для несуществующего домена (т. Е. Интернет доступен и запрос / ответ DNS).завершено) - и в результате я не могу обнаружить нужное мне состояние интернета.

Например, при запуске следующего несуществующего домена с подключением к Интернету:

socket.getaddrinfo("www.thsidomaindoesntexist12309657.com", 80)

Получается исключение:

socket.gaierror: [Errno 11001] getaddrinfo failed

Где errno 11001 соответствует socket.EAI_NONAME.Это ожидаемое поведение, поскольку домен на самом деле не существует.

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

socket.getaddrinfo("www.google.com", 80)

я получаю точното же исключение, что и раньше, по-видимому, указывающее на то, что домен не существует (хотя мы не можем знать, потому что мы никогда не получали ответ DNS).

Как я могу обнаружить отсутствие подключения к Интернету при использовании сокетов и getaddrinfo()? Это невозможно, или это ошибка, с которой я сталкиваюсь, или что-то еще?

1 Ответ

0 голосов
/ 18 декабря 2018

Как я могу обнаружить отсутствие подключения к Интернету при использовании сокетов и getaddrinfo ()

Вы не можете получить информацию от getaddrinfo.Эта функция является абстрактным интерфейсом для разрешения имен, которое может быть выполнено для локального DNS-сервера, но также часто выполняется для DNS-сервера в локальной сети.Функция не предоставляет информации о том, почему ей не удалось разрешить имя, поскольку она часто сама не понимает, почему не удалось разрешить.

Кроме того, даже если поиск DNS завершился успешно, нет никакой гарантии, что на самом деле есть работающий интернет.подключение.Возможно, что результат поиска DNS взят из кэша, или может быть, что можно фактически разрешить имя, но фактическое соединение с целью (например, веб-сервером) заблокировано каким-либо брандмауэром.Может также случиться так, что вы получаете IP-адрес, но он неправильный, как это часто случается с пленными порталами.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...