Jam*_*net 8 python sockets ipv6
目前我这样做:
def get_inet_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('mysite.com', 80))
return s.getsockname()[0]
Run Code Online (Sandbox Code Playgroud)
但是,这看起来有点可疑.据我所知,它打开一个到mysite.com:80的套接字,然后返回该套接字的第一个地址,假设它是一个IPv4地址.这似乎有点狡猾...我不认为我们可以保证这样的情况.
这是我的第一个问题,是否安全?在启用IPv6的服务器上,是否可能意外返回IPv6地址?
我的第二个问题是,我如何以类似的方式获取IPv6地址.我将修改函数以采用可选的ipv6参数.
问题是,你只是想连接,还是你真的想要地址?
如果你只是想连接,你可以做到
s = socket.create_connection(('mysite.com', 80))
Run Code Online (Sandbox Code Playgroud)
并建立连接.
但是,如果您对该地址感兴趣,可以采取以下方式之一:
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
Run Code Online (Sandbox Code Playgroud)
或者,为了更接近另一个已经提出的解决方案:
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]
Run Code Online (Sandbox Code Playgroud)
您应该使用函数socket.getaddrinfo()
获取 IPv6 的示例代码
def get_ip_6(host,port=80):
# discard the (family, socktype, proto, canonname) part of the tuple
# and make sure the ips are unique
alladdr = list(
set(
map(
lambda x: x[4],
socket.getaddrinfo(host,port)
)
)
)
ip6 = filter(
lambda x: ':' in x[0], # means its ip6
alladdr
)
return ip6
Run Code Online (Sandbox Code Playgroud)