【发布时间】:2014-01-08 10:27:04
【问题描述】:
对某些人来说,这似乎是一个奇怪的问题。但我已经搜索并没有找到任何答案。
当我想要一个双栈服务器时,我需要在 INADDR_ANY 上监听 IPv4 和 in6addr_any 对于 IPv6。
如果我有多个网卡,那么我需要选择是要全部收听,还是指定要收听的网卡。
对于这个确切的建议,我使用带有可配置主机名的getaddrinfo 方法。如果host_name 没有配置,那么我用NULL 调用getaddrinfo,并获得两个“ANY”地址。如果我使用 IP(v6 或 v4)配置它,我只会得到一个地址,这也很好。
但是当我使用我的hostname 作为配置的主机名时,在 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”,因为我不能。
【问题讨论】:
-
为什么不能听“ANY”?在对
getaddrinfo()的调用中,您为hints.ai_flags传递了哪些标志?根据getaddrinfo(3)上的Linux手册页,使用的排序功能基于RFC 3484,但我不知道Windows是否也使用相同的排序。 -
因为如果你有两个网络并且你希望你的服务器只在一个网络上运行,那么你想要获取本地地址来监听。当您将主机名提供给
getaddrinfo时,它会解决它。你可以给每个网卡的主机名。
标签: c++ c networking cross-platform getaddrinfo