7

Python を使用して、ipv6 でのみ解決されるホスト名を解決する方法、および/または ipv4 と ipv6 の両方で解決されるホスト名を解決する方法があるのだろうか?

socket.gethostbyname()ipv6 解決では機能しsocket.gethostbyname_ex()ません。

これを行うダミーの方法は、実際の Linux ホスト コマンドを実行し、結果を解析することです。それを行うより良い方法はありますか?

ありがとう、

4

2 に答える 2

17

socket.getaddrinfoは IPv6 をサポートします。familyに設定するだけですAF_INET6

socket.getaddrinfo("example.com", None, socket.AF_INET6)
于 2013-03-12T22:17:33.523 に答える
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

OSErrorsocket.gaierror: [Errno -2] Name or service not knownのサブクラスであるものを取得します。

ところで。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 の両方が有効になっているためです。

于 2019-11-04T18:37:25.500 に答える