当前位置: 首页 > 知识库问答 >
问题:

将IPv4和IPv6源地址绑定到python套接字

甄霖
2023-03-14

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

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

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()。这样,在进行本地地址绑定时,我就可以知道socket.connect()使用的是IPv4还是IPv6。但对我来说,不得不重新实现socket.connect()已经执行的名称解析和选择似乎很愚蠢。

共有1个答案

仲孙超
2023-03-14

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

 类似资料:
  • 此函数创建sockaddr_in6: 基本上,如果地址是IPv4地址,我会在它前面加上,并将该族设置为af_inet。 这有可能做到。如果是,我做错了什么?

  • 问题内容: 我有使用地址的应用程序(它存储它们的时间很长),因此它只了解地址。 可以将地址转换为with 吗? 问题答案: 尽管IPv4地址范围具有等效的IPv6,但是您不能将所有IPv6地址都转换为IPv4-IPv6地址比IPv4地址更多。 解决此问题的唯一明智的方法是更新您的应用程序,以便能够理解和存储IPv6地址。

  • 我正在尝试的是: 我有一个结构: 编辑二:我目前最好的尝试 但现在我不知道如何打印ip和端口

  • 问题内容: 在MySQL数据库中以字符串形式存储IPv4,IPv6地址的理想大小应该是多少。varchar(32)是否足够? 问题答案: 假设文本表示为字符串: IPv4 15个字符(格式,12 + 3分隔符) IPv6的45个字符 这些是字符串的最大长度。 另存为字符串的替代方法: IPv4是32位,因此可以容纳4个字节的MySQL数据类型可以做到,使用和共同使用并处理从地址到数字以及从数字到地

  • 我有一个UDP服务器,它必须同时为IPV4和IPV6地址上的客户端提供服务。我创建了一个IPV6套接字来同时为IPV4和IPV6客户端服务。 服务器在第一次通信时存储客户端的IPAddress。如果是IPV4客户端,则存储为IPV4地址;如果是IPV6客户端,则服务器存储为IPV6地址。对于以后的所有通信,它检查存储是否已知(存储)该客户端,然后相应地执行操作。为了将客户端地址与存储的地址进行比较

  • 谢谢xwpcom纠错 IP地址是IP协议的重要组成部分,它可以识别接入互联网中的任意一台设备。在IP接力中,我们已经看到,IP包的头部写有出发地和目的地的IP地址。IP包上携带的IP地址和路由器相配合,最终允许IP包从互联网的一台电脑传送到另一台。 在IP接力中,我们是以IPv4为例说明IP包的格式的。IPv4和IPv6是先后出现的两个IP协议版本。IPv4的地址就是一个32位的0/1序列,比如1