Python 用IPv6地址解析主机名
我想知道有没有办法用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)