9

現時点で私は:

def get_inet_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('mysite.com', 80))
    return s.getsockname()[0]

これは以下に基づいていました: Finding local IP addresses using Python's stdlib

しかし、これは少し疑わしいようです。私が知る限り、それは mysite.com:80 へのソケットを開き、IPv4 アドレスであると仮定して、そのソケットの最初のアドレスを返します。これは少し危険なように思えます... 私は、それが事実であると保証できるとは思いません。

それが私の最初の質問です、それは安全ですか?IPv6 対応サーバーで、IPv6 アドレスが予期せず返されることはありますか?

2 番目の質問は、同様の方法で IPv6 アドレスを取得する方法です。オプションの ipv6 パラメータを取るように関数を変更します。

4

2 に答える 2

7

問題は、接続したいだけですか、それとも本当にアドレスが必要ですか?

接続したいだけの場合は、次のことができます

s = socket.create_connection(('mysite.com', 80))

接続を確立します。

ただし、アドレスに興味がある場合は、次のいずれかの方法でアクセスできます。

def get_ip_6(host, port=0):
    import socket
    # search only for the wanted v6 addresses
    result = socket.getaddrinfo(host, port, socket.AF_INET6)
    return result # or:
    return result[0][4][0] # just returns the first answer and only the address

または、別の、すでに提示された解決策に近づくために:

def get_ip_6(host, port=0):
     # search for all addresses, but take only the v6 ones
     alladdr = socket.getaddrinfo(host,port)
     ip6 = filter(
         lambda x: x[0] == socket.AF_INET6, # means its ip6
         alladdr
     )
     # if you want just the sockaddr
     # return map(lambda x:x[4],ip6)
     return list(ip6)[0][4][0]
于 2013-04-29T11:40:20.680 に答える