我想检测地址是否为临时 ipv6 地址,我使用 getifaddrs 获取地址列表但不知道如何从那里获取该信息。如果可能的话,我希望它适用于 linux、osx、solaris 和 windows。
我似乎在 Linux 中将 IFA_F_TEMPORARY 设置在 inet6_ifaddr->ifa_flags 中,但不确定如何从 getifaddrs 返回的 ifaddrs 中获取它。
似乎在 OSX 上我需要带有 SIOCSIFINFO_FLAGS 的 octl,但我不知道 Solaris 或 Windows。
有任何机构可以做到这一点的示例代码。
最佳答案
更新(2016 年 8 月 3 日): 在过去几个月断断续续地搜索这个问题之后(因为我自己实际上需要这个答案).我相信我已经找到了以 Windows 为中心的答案。我只在 Windows 10 上测试过,所以我不知道旧版本。但是如果有人想为我验证它,这个 API 不应该改变 :-)
所有 _IP_ADAPTER_UNICAST_ADDRESS 结构都有地址前缀和后缀的枚举。我现在懒得看它们了,它们是解决这个问题的全部关键!
什么是临时 IPv6 地址……这是一个带有随机后缀的地址!因此,对于 IP_ADAPTER_UNICAST_ADDRESS 中的所有 IPv6 地址,查看 IP_SUFFIX_ORIGIN 是否为 IpSuffixOriginRandom。就是这样。
我仍然对网上关于这个话题的内容如此之少感到震惊,如果没有人知道如何解决服务器端应用程序(即使是运行在消费类 PC 上)
您首先在这里听到了答案!!!
(原始答案): 我也一直在研究跨平台应用程序的这个确切主题。我想我已经找到了在 Windows 中过滤 IPv6 临时地址的“一种”方法。基本上 RFC 4941 声称临时地址必须:
- 有效生命周期小于“公共(public)”地址
- 首选生命周期小于“公共(public)”地址
因此对于 C++,当使用像 GetAdaptersAddresses 这样的函数时,您可以在 PIP_ADAPTER_ADDRESSES 结构中查找 _IP_ADAPTER_UNICAST_ADDRESS 结构并评估 ValidLifetime 和 PreferredLifetime 成员。在过滤地址类型后(如果您需要了解本地链接与公共(public)链接),您可以保持最大生命周期的运行记录。最大的生命周期(每个适配器)应该是公共(public)地址!
要快速查看地址生命周期信息,请运行 Windows 终端命令:netsh interface ipv6 show address
您可以看到所有临时地址都比默认的 SLAAC 生命周期小得多。
在测试证明并非如此之前,我目前正在使用这个假设。所有临时地址都是基于公众的,因此无法超越它。
希望对你有帮助
关于c - 跨平台检测临时ipv6地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17833765/