更新(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要求臨時地址必須:
- 有一個有效壽命不到「公共」地址
- 有一個首選的壽命低於「公共」地址
所以對於C++,當使用像GetAdaptersAddresses這樣的函數,您可以在PIP_ADAPTER_ADDRESSES結構中查找_IP_ADAPTER_UNICAST_ADDRESS結構並評估ValidLifetime和PreferredLifetime成員。在過濾地址類型後(如果您需要了解Local-Link vs Public),您可以保持最長使用期限的運行狀態。最長的使用時間(每個適配器)應該是公共地址!
要查看地址生存信息快速運行Windows終端命令:netsh接口的IPv6地址顯示
你可以看到所有臨時地址比違約SLAAC壽命小得多。
我現在正在處理這個假設,直到測試證明爲止。所有的臨時地址都是基於公衆的,因此不能將其存檔。
希望這會有幫助
你有沒有找到答案,何塞?我很好奇自己... – theory
不,它有點複雜,並決定不實施它。 –
無賴。你至少有代碼顯示如何在OS X上使用'octl'來實現這個技巧? – theory