对某些人来说,这似乎是一个奇怪的问题。但我已经搜索并没有找到任何答案。
当我想要一个双栈服务器时,我需要监听INADDR_ANY
IPv4 和in6addr_any
IPv6。
如果我有不止一张网卡,那么我需要选择是要全部收听,还是指定要收听的网卡。
对于这个确切的建议,我正在使用getaddrinfo
带有可配置主机名的方法。如果host_name
还没有配置,那么我getaddrinfo
用 NULL 调用,并获得两个“ANY”地址。如果我使用 IP(v6 或 v4)配置它,我只会得到一个地址,这也很好。
但是当我使用 myhostname
作为配置的 host_name 时,在 Windows 机器上我从getaddrinfo
3 个地址获取:一个 IPv4 地址和两个 IPv6 地址。第一个被 ipconfig 视为“链接本地 IPv6 地址”,第二个被视为“隧道适配器 6TO4 适配器:”部分下的“IPv6 地址”。地址排序如下:
- IPv6 链路本地
- IPv6 地址
- IPv4
所以,如果我在听所有的地址,双栈实际上是三栈。如果我采用第一个 IPv6 地址(因为它是配置了 host_name 的 IPv4 服务器中的约定),我只在“链接本地 IPv6 地址”上侦听,该地址比“IPv6 地址”更难访问,并且许多客户端可以' t 连接到它,而他们可以连接到 IPv4 地址。
现在我正试图进一步复杂化。我已将手机连接到 USB 并激活 USB Tethering。当我通过以下方式解析地址时,getaddrinfo
我得到 5 个地址:按此顺序:
- USB IPv6 链路本地
- 以太网 IPv6 链路本地
- IPv6 地址
- USB IPv4
- 以太网 IPv4
所以我的问题是:
如果只是 IPv4,我会说我只采用第一个 IPv4。并且不关心其余的。但是当使用 IPv6 时,看起来最后一个 IPv6 是最合适的。有什么约定吗?
如果我有多网络机器,我需要选择第一个网络,并同时监听 IPv4 和 IPv6,但这里的结果是混合的。再次,有什么约定吗?
我需要监听所有 IPv6 地址吗?在这种情况下,我将收听一个我不收听相应 IPv4 的 IPv6 地址。我希望避免它。
感谢您的任何帮助或评论。但是请不要建议只听“ANY”,因为我不能。