Python 用IPv6地址解析主机名

7 投票
2 回答
15155 浏览
提问于 2025-04-17 18:52

我想知道有没有办法用Python来解析一个只支持IPv6的主机名,或者一个同时支持IPv4和IPv6的主机名?

socket.gethostbyname()socket.gethostbyname_ex()这两个方法对IPv6的解析不太管用。

一种简单的方法是运行Linux的实际命令,然后解析结果。有没有更好的方法呢?

谢谢,

2 个回答

3

我想在@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。

18

socket.getaddrinfo 支持 IPv6(第六版互联网协议)。你只需要把 family 设置为 AF_INET6 就可以了。

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

撰写回答