对某些人来说,这似乎是一个奇怪的问题。但我搜索过,没有找到任何答案。
当我需要双栈服务器时,我需要在INADDR_ANY
上侦听IPv4,并在in6addr_any
上侦听IPv6。
如果我有多张网卡,那么我需要选择是否要收听所有网卡,或者指定要收听哪张卡。
对于这个确切的建议我使用getaddrinfo
方法和可配置的host_name。如果host_name
尚未配置,则我使用NULL调用getaddrinfo
,并获取两个“任意”地址。如果我用IP(v6或v4)配置它我只得到一个地址,这也没关系。
但是当我使用hostname
作为配置的host_name时,在Windows机器上我从getaddrinfo
3地址获取:一个IPv4地址和两个IPv6地址。第一个被ipconfig视为“链路本地IPv6地址”,第二个被视为“隧道适配器6TO4适配器:”部分下的“IPv6地址”。
这样订购的地址如下:
所以,如果我正在收听所有地址,那么双栈实际上是三重堆栈。如果我采用第一个IPv6地址(因为它是配置了host_name的IPv4服务器中的约定)我只收听“链接本地IPv6地址”,它比“IPv6地址”更难以访问,许多客户端可以'连接到它,同时它们可以连接到IPv4地址。
现在我想进一步复杂化。我将手机连接到USB并激活USB Tethering。当我通过getaddrinfo
解析地址时,我得到5个地址:
按此顺序:
所以我的问题是:
如果只是IPv4,我会说我只选择第一个IPv4。而不关心其余的。但是在使用IPv6时,看起来最后的IPv6是最合适的。是否有任何约定?
如果我有多网络机器,我需要选择第一个网络,并同时监听IPv4和IPv6,但这里的结果是混合的。再次,是否有任何惯例?
我是否需要收听所有IPv6地址?在这种情况下,我将收听一个我不听相应IPv4的IPv6地址。我希望避免它。
感谢您提供任何帮助或评论。 但是请不要建议只听“任何”,因为我不能。
答案 0 :(得分:1)
链接本地地址仅在网段内有效,通常仅适用于您的机器到通信链路另一端的机器。例如,您的USB链接本地地址仅适用于手机和计算机之间的通信,但不能超过此范围;您的链路本地以太网IPv6地址可以在同一集线器/交换机上的所有计算机上使用,但不能在路由器之外使用(有点类似于私有IPv4地址)。如果这不是您预期的用例,我建议您只是忽略链接本地地址。
使用非常特定的模式和掩码创建自动分配的链接本地地址,因此您可以通过编程方式检测它们。链路本地IPv6地址在fe80 :: / 64范围内(意味着地址的第一个字节是fe80:0000:0000:0000
,剩下的8个字节可以是任何东西),链路本地IPv4地址范围从169.254.1.0到169.254.255.255。
另请注意all hosts configure all IPv6-capable interfaces with a link-local address,即使分配了另一个地址也会保留它,因此无法远离它。
答案 1 :(得分:0)
老帖子,我知道,你是怎么解决的?我真的很想知道。
为此,我建议您避免使用该选项,绑定到ANY,通配符"::"
,bind(.., "::", ..)
并使用一些防火墙或打包过滤规则来排除您不想要的连接