python – 为什么getaddrinfo不返回所有IP地址?
我正在尝试获取所有IP地址:earth.all.vpn.airdns.org
(f eprint是打印错误的函数). 但当我这样做时:
我得到大约100个托管. 如何在python中实现这一点?为什么我没有得到所有的“getaddrinfo”? 此行为仅使用Windows(python 3)出现.当我在我的Linux(python 2.7)上执行代码时,它给出了与使用nslookup相同的结果. info:如答案所解释的那样,它不依赖于系统. 在不改变任何内容的情况下,nslookup和getaddrinfo的结果现在是相同的. 最佳答案
dig,host和nslookup等工具直接使用UDP / TCP及其自己的DNS查询实现查询默认DNS服务器,而Python的套接字模块使用操作系统的DNS查找接口,该接口通常使用更复杂的查找机制,例如涉及dns缓存,主机文件,域后缀,链接本地名称解析等.
strace显示Python的socket.getaddrinfo最终使用netlink(AF_NETLINK)套接字来查询系统的DNS查找(Ubuntu 12.04上的Python 2.7).但是,nslookup从/etc/resolv.conf读取默认DNS服务器并在端口53上打开UDP套接字. 我认为有两个原因可以让您获得不同的入门次数: > DNS条目非常不稳定,可能随时改变 此外,nslookup可能会产生与系统解析器略有不同的DNS查询(产生另一个答案).这可以通过Wireshark检查,但我现在就离开了. 另一个问题可能是在使用UPD时截断DNS响应.如果有大量条目,它们将不适合单个UDP包,因此答案包含截断标志.它取决于客户端通过TCP套接字重新发送DNS查询以检索所有结果. (截断的答案实际上是空的). 编辑:关于缓存/易失性的说明 即使不匹配不是由于您的本地DNS缓存,也可能是由于服务器端缓存.我尝试了几个DNS服务器,并且都为该特定名称提供了不同的结果.这意味着由于生存时间(TTL)内的DNS更改,它们不同步. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |