2015-10-09 3 views
1

У меня возникла проблема с сценарием Python, который должен должен проверить, подключен ли пользователь к сети Wi-Fi с невольным порталом. В частности, сценарий длительный, пытаясь подключиться к example.org каждые 60 секунд.socket.getaddrinfo не работает, если сеть запущена в автономном режиме

Проблема заключается в том, что если сеть начинает автономный режим (то есть Wi-Fi не подключен в начале скрипта), socket.getaddrinfo будет всегда завершаться с ошибкой «Имя или служба не известны», даже когда-то Wi-Fi подключен до перезапуска скрипта Python. (Это не DNS вещь - все запросы терпят неудачу.)

Так как urllib и requests использование sockets, это совершенно невозможно, чтобы загрузить пример страницы, как только Python попадает в это состояние.

Есть ли способ обхода этого способа или способ сброса sockets, чтобы он работал правильно после сбоя сети?

Чтобы было ясно, вот репродукция:

  1. Отключение WiFi
  2. Run интерактивная сессия Python
  3. import urllib и urllib.open("http://stackoverflow.com/") - терпит неудачу, как и ожидалось
  4. Переустановка WiFi
  5. urllib.open("http://example.com/")

Ожидаемое: Возвращается HTML от example.com
Actual: socket.gaierror: [Errno -2] Name or service not known

ответ

-1

Если вы не подключены к точке доступа при выполнении сценария, и не имеют IP-адрес, назначенный для устройства socket.getaddrinfo подведет. Возможно, он все еще подключается, когда вы запускаете скрипт. Имя домена не может быть разрешено, потому что вы не подключены к сети, поэтому DNS не существует.

Это происходит, если вы действительно подключены к сети? Делает ли curl http://icanhazip.com работу в момент сбоя скрипта? Или, если вы используете ifconfig, у вашего устройства есть IP-адрес? (Я предполагаю, что вы на коробке * nix).

+0

Да, он все еще не работает при подключении к сети. Проблема заключается в том, что состояние сети не имеет значения, если все, если сеть не подключена при вызове _first_. После этого первого вызова я могу подключиться к сети и повторно запустить 'socket.getaddrinfo' столько раз, сколько захочу. Это не сработает. –