3

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

当我想要一个双栈服务器时,我需要监听INADDR_ANYIPv4 和in6addr_anyIPv6。

如果我有不止一张网卡,那么我需要选择是要全部收听,还是指定要收听的网卡。

对于这个确切的建议,我正在使用getaddrinfo带有可配置主机名的方法。如果host_name还没有配置,那么我getaddrinfo用 NULL 调用,并获得两个“ANY”地址。如果我使用 IP(v6 或 v4)配置它,我只会得到一个地址,这也很好。

但是当我使用 myhostname作为配置的 host_name 时,在 Windows 机器上我从getaddrinfo3 个地址获取:一个 IPv4 地址和两个 IPv6 地址。第一个被 ipconfig 视为“链接本地 IPv6 地址”,第二个被视为“隧道适配器 6TO4 适配器:”部分下的“IPv6 地址”。地址排序如下:

  1. IPv6 链路本地
  2. IPv6 地址
  3. IPv4

所以,如果我在听所有的地址,双栈实际上是三栈。如果我采用第一个 IPv6 地址(因为它是配置了 host_name 的 IPv4 服务器中的约定),我只在“链接本地 IPv6 地址”上侦听,该地址比“IPv6 地址”更难访问,并且许多客户端可以' t 连接到它,而他们可以连接到 IPv4 地址。

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

  1. USB IPv6 链路本地
  2. 以太网 IPv6 链路本地
  3. IPv6 地址
  4. USB IPv4
  5. 以太网 IPv4

所以我的问题是:

  1. 如果只是 IPv4,我会说我只采用第一个 IPv4。并且不关心其余的。但是当使用 IPv6 时,看起来最后一个 IPv6 是最合适的。有什么约定吗?

  2. 如果我有多网络机器,我需要选择第一个网络,并同时监听 IPv4 和 IPv6,但这里的结果是混合的。再次,有什么约定吗?

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

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

4

2 回答 2

1

链接本地地址仅在网段内有效,并且通常仅适用于您的机器到通信链路另一端的机器。例如,您的 USB 链接本地地址仅适用于您的手机和计算机之间的通信,但不能用于此之外;您的链路本地以太网 IPv6 地址将可用于同一集线器/交换机上的所有计算机,但不能超出路由器(有点类似于私有 IPv4 地址)。如果这不是您预期的用例,我建议您直接忽略链接本地地址。

自动分配的链接本地地址是使用非常特定的模式和掩码创建的,因此您可以通过编程方式检测它们。链路本地 IPv6 地址在 fe80::/64 范围内(意味着地址的第一个字节是fe80:0000:0000:0000,其余 8 个字节可以是任何值),链路本地 IPv4 地址范围从 169.254.1.0 到 169.254.255.255。

另请注意,所有主机都使用链接本地地址配置所有支持 IPv6 的接口,即使为它们分配了另一个地址,它们也会保留它,因此无法摆脱它。

于 2013-12-19T18:21:57.807 回答
0

老帖子,我知道,你最后是怎么解决的?我真的很想知道。

为此,我建议您避免使用该选项,绑定到 ANY、通配符"::"bind(.., "::", ..)并使用一些防火墙或包过滤器规则来排除您不想要的连接。

于 2015-06-26T07:43:24.017 回答