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

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

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

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

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

  • 它确实缠绕了Windows笔记本电脑,而不是Android Phone。它确实找到
  • 一台MacBook,而不是iMac,而不是另一台MacBook。它也没有
  • 找到任何电话。

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

    我可以对它们执行ping操作,它的响应很好。但是当我使用socket.gethostbyaddr(ip_modified_by_the_loop_each_time)时会引发错误。

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

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

    谢谢你。

    最佳答案

    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)将声明主机名是localhost。并且,如果PTR记录丢失,即使主机处于联机状态,gethostbyaddr也将失败。

    另请参见wikipedia: reverse dns lookup

    关于sockets - .gethostbyaddr()不适用于所有设备。为什么? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39176870/

    相关文章:

    java - 将传入的 TCP "Commands"转发给函数?

    python - 在 Python 中创建包含多个子包的包

    android - 在一个 WiFi 网络上获取多个 Android 设备以共享信息的最佳方式

    android - 在森林中通过 Wi-Fi 连接多个设备

    C 编程 - 套接字 ("Server"在聊天中显示 "Client"名称)

    C套接字编程: Trying to serve new client connections using fork()

    java - ObjectOutputStream 对象有时会自动刷新。我如何才能准确地知道何时依赖此行为以及何时手动刷新?

    python - 在进行逻辑回归时,如何解决Python中的值错误?

    python - 如何在 with 和 for 语句之前创建一个与 open() 具有相同行为的对象

    android - 使用ifconfig在Android中打开网络但它不起作用