您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 为什么getaddrinfo不返回所有IP地址?

5b51 2022/1/14 8:21:52 python 字数 3431 阅读 506 来源 www.jb51.cc/python

我正在尝试获取所有IP地址:earth.all.vpn.airdns.org在Python中:def hostnamesToIps(hostnames): ip_list = [] for hostname in hostnames: try: ais = socket.getaddrinfo(hostname, N

概述

我正在尝试获取所有IP地址:earth.all.vpn.airdns.org
Python中:

def hostnamesToIps(hostnames):
  ip_list = []

  for hostname in hostnames:
      try:
          ais = socket.getaddrinfo(hostname,None)
          for result in ais:
              #print (result[4][0])
              ip_list.append(result[-1][0])
      except:
          eprint("Unable to get IP for hostname: " + hostname)

return list(set(ip_list))

(f eprint是打印错误函数).
输出给了我29个地址.

但当我这样做时:

nslookup earth.all.vpn.airdns.org

我得到大约100个托管.

如何在python中实现这一点?为什么我没有得到所有的“getaddrinfo”?

此行为仅使用Windows(python 3)出现.当我在我的Linux(python 2.7)上执行代码时,它给出了与使用nslookup相同的结果.

info:如答案所解释的那样,它不依赖于系统.

在不改变任何内容的情况下,nslookup和getaddrinfo的结果现在是相同的.

strace显示Python的socket.getaddrinfo最终使用netlink(AF_NETLINK)套接字来查询系统的DNS查找(Ubuntu 12.04上的Python 2.7).但是,nslookup从/etc/resolv.conf读取DNS服务器并在端口53上打开UDP套接字.

我认为有两个原因可以让您获得不同的入门次数

> DNS条目非常不稳定,可能随时改变
> Python返回系统DNS缓存提供的缓存条目,而nslookup始终检索“新鲜”结果.

此外,nslookup可能会产生与系统解析器略有不同的DNS查询(产生另一个答案).这可以通过Wireshark检查,但我现在就离开了.

一个问题可能是在使用UPD时截断DNS响应.如果有大量条目,它们将不适合单个UDP包,因此答案包含截断标志.它取决于客户端通过TCP套接字重新发送DNS查询以检索所有结果. (截断的答案实际上是空的).

编辑:关于缓存/易失性的说明

即使不匹配不是由于您的本地DNS缓存,也可能是由于服务器端缓存.我尝试了几个DNS服务器,并且都为该特定名称提供了不同的结果.这意味着由于生存时间(TTL)内的DNS更改,它们不同步.

总结

以上是编程之家为你收集整理的python – 为什么getaddrinfo不返回所有IP地址?全部内容,希望文章能够帮你解决python – 为什么getaddrinfo不返回所有IP地址?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶