Python を使用して、ipv6 でのみ解決されるホスト名を解決する方法、および/または ipv4 と ipv6 の両方で解決されるホスト名を解決する方法があるのだろうか?
socket.gethostbyname()
ipv6 解決では機能しsocket.gethostbyname_ex()
ません。
これを行うダミーの方法は、実際の Linux ホスト コマンドを実行し、結果を解析することです。それを行うより良い方法はありますか?
ありがとう、
socket.getaddrinfoは IPv6 をサポートします。family
に設定するだけですAF_INET6
。
socket.getaddrinfo("example.com", None, socket.AF_INET6)
@john-colanduoni の回答をさらに詳しく説明したいと思います。
実際に対応する 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
OSErrorsocket.gaierror: [Errno -2] Name or service not known
のサブクラスであるものを取得します。
ところで。localhost
お使いのhostname
コンピューターの を (IPv6 が有効になっている場合)、またはexample.com
ホスト名の引数として使用してみてください。
PTR レコードのクエリは次のようになります。
>>> print(socket.gethostbyaddr('2a00:1450:4001:81d::200e')[0])
fra15s18-in-x0e.1e100.net
socket.gethostbyaddrは IPv4 と IPv6 の両方が有効になっているためです。