将IPv4和IPv6源地址绑定到python

2024-04-27 02:28:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

那么,如果在调用socket.connect()之前不知道是IPv4地址还是IPv6地址,那么如何将特定的IPv6源地址和IPv4“any”地址绑定到本地套接字?在

现在我正在处理它,但在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()已经完成的名称解析和选择似乎很愚蠢。在


Tags: 名称应用程序hostbindport地址connectany
1条回答
网友
1楼 · 发布于 2024-04-27 02:28:49

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

相关问题 更多 >