2015-09-28 122 views
1

我有一个python应用程序需要为IPv6连接选择特定的本地源地址,但可以使用“any”0.0.0.0作为IPv4连接。但是应用程序使用socket.connect((host, port))中的主机名来允许socket.connect()从名称中进行地址查找。将IPv4和IPv6源地址绑定到python套接字

那么,如何结合具体的报文的源地址和IPv4“任何”地址到本地套接字因为我不知道以前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()已经做的选择。

回答

2

您不能将多个地址绑定到同一个套接字,也不能将两次绑定到同一个套接字。相反,您必须首先使用getaddrinfo来解析地址,然后使用从getaddrinfo获得的sockaddr来使用低级connect。 getaddrinfo还会告诉你这是哪种类型的套接字,这样你就可以绑定到IPv6地址,以防万一你必须连接到IPv6地址。

相关问题