Python使用IPv6地址解析主机名

时间:2013-03-12 22:14:40

标签: python dns ipv6

我想知道是否有办法使用python来解析仅在ipv6中解析的主机名和/或在ipv4和ipv6中解析的主机名?

socket.gethostbyname()socket.gethostbyname_ex()不适用于ipv6解析。

这样做的一种虚拟方法是运行实际的linux主机命令并解析结果。有没有更好的方法呢?

谢谢,

2 个答案:

答案 0 :(得分:14)

socket.getaddrinfo支持IPv6。您只需将family设置为AF_INET6

socket.getaddrinfo("example.com", None, socket.AF_INET6)

答案 1 :(得分:0)

我想详细介绍@ john-colanduoni的答案。

仅获取IPv6地址

要真正仅获得 相应的IPv6地址,应尝试使用socket.getaddrinfo

>>> print(socket.getaddrinfo('www.microsoft.com', None, socket.AF_INET6)[0][4][0])
2a02:26f0:6a:288::356e

但是要小心,例如如果主机名没有IPv6 AAAA记录,例如:

>>> print(socket.getaddrinfo('microsoft.com', None, socket.AF_INET6)[0][4][0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

您将获得socket.gaierror: [Errno -2] Name or service not known,它是OSError的子类。

顺便说一句。尝试使用localhost,计算机的hostname(如果启用了IPv6)或example.com作为主机名参数。

IPv6地址中的主机名

查询PTR记录如下:

>>> print(socket.gethostbyaddr('2a00:1450:4001:81d::200e')[0])
fra15s18-in-x0e.1e100.net

因为socket.gethostbyaddr同时启用了IPv4和IPv6。

相关问题