簡體   English   中英

將 IPv4 和 IPv6 源地址綁定到 python 套接字

[英]Bind both IPv4 and IPv6 source address to python socket

我有一個 python 應用程序,它需要為 IPv6 連接選擇一個特定的本地源地址,但可以為 IPv4 連接使用“任何”0.0.0.0。 但是應用程序在socket.connect((host, port))使用主機名,以允許socket.connect()從名稱進行地址查找。

那么我如何將特定的 IPv6 源地址和 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()已經完成的名稱解析和選擇似乎很愚蠢。

您不能將多個地址綁定到同一個套接字,也不能兩次綁定到同一個套接字。 相反,您必須首先使用getaddrinfo解析地址,然后使用從 getaddrinfo 獲得的 sockaddr 的低級連接 getaddrinfo 還會告訴您這是哪種類型的套接字,以便您可以綁定到 IPv6 地址,以防您必須連接到 IPv6 地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM