Я пытаюсь выделить различные типы ошибок, которые могут возникнуть при использовании модуля 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()
? Это невозможно, или это ошибка, с которой я сталкиваюсь, или что-то еще?