【问题标题】:DNS.query vs Socket.gethostbynameDNS.query 与 Socket.gethostbyname
【发布时间】:2019-07-16 11:57:20
【问题描述】:

python DNS.query 和 socket.gethostbyname 有什么区别,哪个更准确?

我正在使用 DNS.query 来查找网站的 IPv4。 socket.gethostbyname 做同样的任务。那么构建python浏览器有什么不同,哪个更快更准确。

【问题讨论】:

    标签: python sockets networking dns


    【解决方案1】:

    在您的上下文中定义“准确”。

    系统有多种方法来解析名称。它可以使用来自/etc/hosts 的内容。它可以使用 LDAP。它可以使用 Windows 名称解析。它可以使用DNS。还有很多其他的东西。

    在 Linux 系统上,您有一个名为 /etc/nsswitch.conf 的文件,它告诉系统您希望如何解析名称。例如,您可能在其中有一行:

    hosts:          files dns
    

    也就是说,在这台主机上,解析一个名字,系统会先搜索/etc/hosts,如果没有找到,就去DNS。

    所以socket.gethostbyname 将向操作系统询问名称,因此将使用上述机制。

    如果您使用DNS.query,您“只是”进行 DNS 查询,仅此而已。如果要解析的名称只有/etc/hosts,则无法解析。

    因此,什么是准确的取决于您的约束条件和上下文。两个调用做不同的事情。

    也如文档中所述,无论如何您都应该使用getaddrinfo 而不是gethostbyname

    gethostbyname() 不支持 IPv6 名称解析,并且 应该使用 getaddrinfo() 代替 IPv4/v6 双栈支持。

    【讨论】:

    • 感谢帕特里克。答案确实有助于理解这两种方法并根据案例进行选择。
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2013-12-30
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多