我有一个Python应用程序,需要为IPv6连接选择特定的本地源地址,但可以对IPv4连接使用“任意”0.0.0.0。但是该应用程序在
那么,在不知道名称查找将导致IPv4地址还是IPv6地址之前,我如何将特定的IPv6源地址和IPv4“任意”地址绑定到本地套接字?
目前,我通过在
当然,不能保证在异常处理程序中的`socket.connect()`会解析主机名为IPv4地址,因为之前的`socket.connect()`并不一定这样做。
肯定有更好的方法。我猜想我得自己实现地址查找和选择,并传递一个地址而不是名称给`socket.connect()`。这样,当我进行本地地址绑定时,我就知道`socket.connect()`将使用IPv4还是IPv6。但我觉得让我重新实现`socket.connect()`已经做好的名称解析和选择看起来很傻。
socket.connect((host, port))
中使用主机名来允许socket.connect()
从名称执行地址查找。那么,在不知道名称查找将导致IPv4地址还是IPv6地址之前,我如何将特定的IPv6源地址和IPv4“任意”地址绑定到本地套接字?
目前,我通过在
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()`已经做好的名称解析和选择看起来很傻。