.gethostbyaddr()不适用于所有设备。为什么? (Python)的

时间:2016-08-27 02:25:48

标签: sockets python-3.x networking ip-address hostname

我写了一个脚本,遍历了' 0'中的所有本地IP。网络(192.168.0。*)。

我使用socket.gethostbyaddr(ip_modified_by_the_loop_each_time)的循环。

循环返回3个设备的主机名。 现在,我发现它找不到4个设备(至少)。

  • 它会刮我的Windows笔记本电脑,而不是我的Android手机。确实找到了
  • 一台MacBook,不是iMac,不是其他MacBook。它也没有
  • 找到任何电话。

我知道所有设备都在线且有IPv4地址。

我可以很好地ping它们,它反应很好。但是当我使用socket.gethostbyaddr(ip_modified_by_the_loop_each_time)时,它会抛出一个错误。

我使用try: / except:语句来解决错误,但它仍无法通过IP找到我的手机并获取主机名,但我知道它就在那里。 我正在使用python 3.3

为什么会发生这种情况,如何解决?

谢谢。

1 个答案:

答案 0 :(得分:0)

gethostbyaddr尝试使用本地存储的信息(即/etc/hosts)或执行反向DNS查找来查找给定IP地址的主机名。结果不依赖于主机是否在线,它们仅取决于这些信息的可用性。

这些信息也是不可信任的。例如,域的DNS运营商可以添加以下记录:

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

在这种情况下,gethostbyname的查找(test.example.com)将返回此主机的IP地址,而反向查找(gethostbyaddr)将声明主机名为{{1} }。如果PTR记录丢失,localhost将失败,即使主机在线。

另见wikipedia: reverse dns lookup