2016-08-27 5 views
1

Я написал сценарий, который проходит через все локальные IP-адреса в сети «0» (192.168.0. *)..gethostbyaddr() не работает на всех устройствах. Зачем? (Python)

Я использую петлю с socket.gethostbyaddr(ip_modified_by_the_loop_each_time).

Цикл возвращает мне 3 устройства своим именам хостов. Теперь я обнаружил, что он не находит 4 устройства (по крайней мере).

  • Это действительно мой ноутбук для Windows, а не мой Android-телефон. Он находит
  • один MacBook, а не iMac, а не другой MacBook. Это также не
  • найти любой телефон.

Я знаю, что все устройства находятся в сети и имеют IPv4-адрес.

Я могу проверить их очень хорошо, он отлично реагирует. Но когда я использую socket.gethostbyaddr(ip_modified_by_the_loop_each_time), он выдает сообщение об ошибке.

Я использовал инструкцию try:/except:, чтобы обойти эту ошибку, но она по-прежнему не может найти мой телефон по IP и получить имя хоста, но я знаю, что он есть. Я использую python 3.3

Почему это происходит, как это исправить?

спасибо.

ответ

0

gethostbyaddr пытается узнать имя хоста для данного IP-адреса, используя локально сохраненную информацию (то есть /etc/hosts) или обратный поиск DNS. Результат не зависит от того, что хост находится в сети или нет, они зависят только от доступности этих данных.

И этой информации также нельзя доверять. Например, DNS-оператор домена может добавить следующие записи:

test.example.com  A public.ip.of.test 
    public.ip.of.test  PTR localhost. 

В этом случае поиск (gethostbyname) из test.example.com возвратит IP-адрес этого хоста в то время как обратный поиск (gethostbyaddr) будет утверждать, что hostname - localhost. И если запись PTR будет отсутствовать, то gethostbyaddr потерпит неудачу, даже если хост находится в сети.

См. Также wikipedia: reverse dns lookup.

 Смежные вопросы

  • Нет связанных вопросов^_^