c - 跨平台检测临时ipv6地址

标签 c network-programming

我想检测地址是否为临时 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 声称临时地址必须:

  1. 有效生命周期小于“公共(public)”地址
  2. 首选生命周期小于“公共(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/

相关文章:

使用 complex.h 库在 Visual Studio 2013 中编译 C 代码

c - Mac OS X 塞拉利昂 : Undefined symbols for architecture x86_64

c - WinPcap 没有捕获任何 arp 数据包

Python Bottle 网站在网络上可见吗?

network-programming - 处理 select() 时到达的数据

c - 随机改变结构数组的值

c - 试图编写一个整数比较方法,但它不起作用

c - 开关盒不打印 c

unity-game-engine - Unity 网络 Material 颜色更改不起作用

java - Android 收不到网络数据?