我有一个python应用程序,需要为IPv6连接选择特定的本地源地址,但可以使用“any”0.0.0.0进行IPv4连接。但是应用程序在socket.connect((host, port))
中使用主机名允许socket.connect()
从名称中进行地址查找。
那么我如何将特定的IPv6源地址和IPv4“any”地址绑定到本地套接字,因为在调用socket.connect()
之前我不知道是否会产生IPv4地址或IPv6地址从名称查找?
现在我正在处理socket.EAI_ADDRFAMILY
上的例外:
try:
sock.bind(("2601:a2a0:a0aa:1d00:aeaa:aaff:aa6c:aaab",0))
sock.connect((host, port))
except socket.gaierror, e:
if e[0] == socket.EAI_ADDRFAMILY:
sock.bind(("0.0.0.0",0))
sock.connect((host, port))
但是,当然不能保证异常处理程序中的socket.connect()
会将主机解析为IPv4地址,因为之前的socket.connect()
就是这样。
必须有更好的方法。我怀疑我必须自己实现地址查找和选择并传递地址,而不是名称socket.connect()
。这样我就知道我在做本地地址绑定时socket.connect()
是使用IPv4还是IPv6。但是,对于我来说,重新实现socket.connect()
已经做过的名称解析和选择似乎很愚蠢。
答案 0 :(得分:2)
您无法将多个地址绑定到同一个套接字,并且无法将两次绑定到同一个套接字。相反,您必须首先使用getaddrinfo解析地址,然后使用低级connect和getaddrinfo获得的sockaddr。 getaddrinfo还会告诉您这是哪种类型的套接字,以便在必须连接到IPv6地址时可以绑定到IPv6地址。