选择IPv6服务器的监听地址(双栈)

时间:2013-12-19 18:08:09

标签: c++ c networking cross-platform getaddrinfo

对某些人来说,这似乎是一个奇怪的问题。但我搜索过,没有找到任何答案。

当我需要双栈服务器时,我需要在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地址”。 这样订购的地址如下:

  1. IPv6 Link Local
  2. IPv6地址
  3. 的IPv4
  4. 所以,如果我正在收听所有地址,那么双栈实际上是三重堆栈。如果我采用第一个IPv6地址(因为它是配置了host_name的IPv4服务器中的约定)我只收听“链接本地IPv6地址”,它比“IPv6地址”更难以访问,许多客户端可以'连接到它,同时它们可以连接到IPv4地址。

    现在我想进一步复杂化。我将手机连接到USB并激活USB Tethering。当我通过getaddrinfo解析地址时,我得到5个地址: 按此顺序:

    1. USB IPv6 Link Local
    2. 以太网IPv6链路本地
    3. IPv6地址
    4. USB IPv4
    5. 以太网IPv4
    6. 所以我的问题是:

      1. 如果只是IPv4,我会说我只选择第一个IPv4。而不关心其余的。但是在使用IPv6时,看起来最后的IPv6是最合适的。是否有任何约定?

      2. 如果我有多网络机器,我需要选择第一个网络,并同时监听IPv4和IPv6,但这里的结果是混合的。再次,是否有任何惯例?

      3. 我是否需要收听所有IPv6地址?在这种情况下,我将收听一个我不听相应IPv4的IPv6地址。我希望避免它。

      4. 感谢您提供任何帮助或评论。 但是请不要建议只听“任何”,因为我不能。

2 个答案:

答案 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(.., "::", ..)并使用一些防火墙或打包过滤规则来排除您不想要的连接