检测临时ipv6地址跨平台

时间:2013-07-24 12:14:45

标签: c network-programming

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

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

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

有任何正文可以做到的示例代码。

1 个答案:

答案 0 :(得分:3)

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

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

什么是临时IPv6地址....它是一个带有RANDOM SUFFIX的地址!因此,对于IP_ADAPTER_UNICAST_ADDRESS中的所有IPv6地址,请查看 IP_SUFFIX_ORIGIN ,看看它是 IpSuffixOriginRandom 。而已。

我真的对网上这个主题有多少感到震惊,如果没有人知道如何为服务器端应用程序解决这个问题,这对网络应用程序开发人员来说将是一个巨大的问题(甚至在消费者PC上运行的那些)

你先在这里听到了答案!

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

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

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

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

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

    希望这有帮助