更新(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 要求临时地址必须:
- 有效生命周期小于“公共”地址
- 有一个小于“公共”地址的首选生命周期
因此对于 C++,当使用 GetAdaptersAddresses 之类的函数时,您可以在 PIP_ADAPTER_ADDRESSES 结构中查找 _IP_ADAPTER_UNICAST_ADDRESS 结构并评估 ValidLifetime 和 PreferredLifetime 成员。过滤地址类型后(如果您需要了解本地链接与公共),您可以保持最长生命周期的运行记录。最长的生命周期(每个适配器)应该是公共地址!
要快速查看地址生存期信息,请运行 Windows 终端命令:netsh interface ipv6 show address
您可以看到所有临时地址都远小于默认的 SLAAC 生命周期。
我现在正在处理这个假设,直到测试证明不是这样。所有临时地址都是基于公众的,因此无法生存。
希望这可以帮助