【问题标题】:.gethostbyaddr() does not work on all devices. Why? (Python).gethostbyaddr() 不适用于所有设备。为什么? (Python)
【发布时间】:2016-08-27 02:25:48
【问题描述】:

我编写了一个脚本,它通过“0”网络 (192.168.0.*) 中的所有本地 IP。

我使用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

为什么会这样,如何解决?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    另见wikipedia: reverse dns lookup

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多