2013-07-24 53 views
5

我想檢測一個地址是否是臨時ipv6地址,我使用getifaddrs獲取地址列表,但不知道如何從那裏獲取該信息。如果可能的話,我希望爲linux,osx,solaris和windows工作。檢測臨時ipv6地址跨平臺

我似乎在Linux中IFA_F_TEMPORARY在inet6_ifaddr-> ifa_flags中設置,但不知道如何從getifaddrs返回的ifaddrs中獲取。

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

有任何正文可以做到這一點的示例代碼。

+0

你有沒有找到答案,何塞?我很好奇自己... – theory

+0

不,它有點複雜,並決定不實施它。 –

+0

無賴。你至少有代碼顯示如何在OS X上使用'octl'來實現這個技巧? – theory

回答

2

更新(2016年8月3日):搜索和關閉在這個問題上,過去幾個月(因爲我需要這個其實是我自己回答)之後。我相信我找到了以Windows爲中心的答案。我只在Windows 10上測試過,所以我不知道舊版本。但是,如果有人想爲我驗證此API,則此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接口的IPv6地址顯示

你可以看到所有臨時地址比違約SLAAC壽命小得多。

我現在正在處理這個假設,直到測試證明爲止。所有的臨時地址都是基於公衆的,因此不能將其存檔。

希望這會有幫助

+0

這在我的機器上不起作用。我的臨時IP地址和常規IP地址都具有相同的生命週期: 地址類型DAD狀態有效生命優先級。生活地址 --------- ----------- ---------- ---------- ------- ----------------- Public首選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 – Philipp

+0

那麼我唯一的想法就是你所描述的將違背RFC 4941第3.3.4節和isn在Windows 8.1和Windows 10下,我可以在測試中使用IPv6(來自Verizon和Comcast的IPv6 DHCP)。因此,我無法說出您發佈的內容。如果事實確實如此,那麼存在不合適的邊緣情況。希望別人找到更好的方法。 – Josh