首页 > 解决方案 > DNS.query 与 Socket.gethostbyname

问题描述

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

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

标签: pythonsocketsnetworkingdns

解决方案


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

系统有多种方法来解析名称。它可以使用来自/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 双栈支持。


推荐阅读