【问题标题】:detect temporary ipv6 address crossplatform检测临时 ipv6 地址跨平台
【发布时间】:2013-07-24 12:14:44
【问题描述】:

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

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

似乎在 OSX 上我需要带有 SIOCSIFINFO_FLAGS 的 octl,而我不知道 Solaris 或 Windows。

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

【问题讨论】:

  • 你找到答案了吗,何塞?我自己也很好奇……
  • 不行,有点复杂,决定不实现了。
  • 无赖。您是否至少有代码显示如何在 OS X 上使用 octl 来解决问题?
  • trac.v2.nl/browser/zeroconf/mDNSResponder/mDNSMacOSX/… 查看检查 IN6_IFF_TEMPORARY 的代码
  • 谢谢,很有帮助!在 OS X 和 iOS 模拟器上运行良好,但唉! <netinet6/in6_var.h> 不包含在 iOS 设备上。我怀疑 Apple 不希望任何人知道 iOS 上的 IPv6 地址是否是私有/临时的。

标签: c network-programming


【解决方案1】:

更新(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 要求临时地址必须:

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

所以对于 C++,当使用像 GetAdaptersAddresses 这样的函数时,您可以在 PIP_ADAPTER_ADDRESSES 结构中查找 _IP_ADAPTER_UNICAST_ADDRESS 结构并评估 ValidLifetime 和 PreferredLifetime 成员。过滤地址类型后(如果您需要了解本地链接与公共),您可以保持最长生命周期的运行记录。最长的生命周期(每个适配器)应该是公共地址!

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

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

我目前正在处理这个假设,直到测试证明并非如此。所有的临时地址都是基于公众的,所以不能活下去。

希望对你有帮助

【讨论】:

  • 这在我的机器上不起作用。我的临时 IP 地址和常规 IP 地址都显示相同的生命周期:Addr Type DAD State Valid Life Pref。生活地址 --------- ----------- ---------- ---------- -------- ---------------- 公共首选 1h58m15s 16m36s xxxx:xx:xxxx:2000:71e7:xxxx:xxxx:f4 5b 临时首选 1h58m15s 16m36s xxxx:xx:xxxx:2000:8479: xxxx:xxxx:a7 0a 其他首选无限无限 fe80::71e7:xxxx:xxxx:f45b%19
  • 好吧,我唯一的想法是您所描述的内容将违反 RFC 4941 第 3.3.4 节,并且我无法在测试中重现(使用来自 Verizon 和 Comcast 的 IPv6 DHCP) Windows 8.1 和 Windows 10。所以我不能谈论你发布的内容。如果这实际上是真的,那么存在不正确的边缘情况。希望其他人找到更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2011-07-31
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多