2015-09-28 165 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地址。

相關問題