检测临时ipv6地址跨平台

我想检测一个地址是否是临时ipv6地址,我使用getifaddrs获取地址列表但不知道如何从那里获取该信息。 如果可能的话,我希望它适用于linux,osx,solaris和windows。

我似乎在Linux中IFA_F_TEMPORARY设置在inet6_ifaddr-> ifa_flags中,但不确定我是如何从getifaddrs返回的ifaddrs中获得的。

似乎在OSX上我需要octl与SIOCSIFINFO_FLAGS,我不知道Solaris或Windows。

有任何机构可以做到这一点的示例代码。

更新(2016年8月3日):在这个问题上搜索过去几个月后(因为我实际上自己需要这个答案)。 我相信我找到了以Windows为中心的答案。 我只在Windows 10上测试了这个,所以我不知道旧版本。 但是如果有人想为我validation它,这个API应该不会改变:-)

所有_IP_ADAPTER_UNICAST_ADDRESS结构都具有地址前缀和后缀的枚举。 我现在很想看看它们,它们是解决这个问题的全部关键!

什么是临时IPv6地址….这是一个带有随机后缀的地址! 因此,对于IP_ADAPTER_UNICAST_ADDRESS中的所有IPv6地址,请查看IP_SUFFIX_ORIGIN,看看它是否是IpSuffixOriginRandom 。 而已。

我真的对网上这个话题有多少感到震惊,如果没有人知道如何为服务器端应用程序解决这个问题(即使是在个人电脑上运行的应用程序),对于网络应用程序开发人员来说这将是一个巨大的问题。 )

你先听到答案!


(原始答案):我一直在为跨平台应用程序查看这个确切的主题。 我想我找到了一种在Windows中过滤IPv6临时地址的方法。 基本上RFC 4941声称临时地址必须:

  1. 有效生命周期小于“公共”地址
  2. 使首选生命周期小于“公共”地址

因此,对于C ++,当使用类似GetAdaptersAddresses的函数时,您可以在PIP_ADAPTER_ADDRESSES结构中查找_IP_ADAPTER_UNICAST_ADDRESS结构并评估ValidLifetime和PreferredLifetime成员。 过滤地址类型后(如果您需要知道Local-Link vs Public),您可以保持最长生命周期的运行记录。 最长的使用寿命(每个适配器)应该是公共地址!

要查看地址生存期信息,请快速运行Windows终端命令:netsh interface ipv6 show address

您可以看到所有临时地址都比默认的SLAAC生命周期小得多。

我现在正在使用这个假设,直到测试certificate不是这样。 所有临时地址都是基于公众的,因此无法生效。

希望这可以帮助