我試圖找到我的外部IP地址,但我只在NAT後面獲得本地IP地址。如何使用NSHost獲取外部IP地址?
NSArray *addresses = [[NSHost currentHost] addresses];
有沒有辦法打印公共地址?使用NSHost是一個好主意?
我試圖找到我的外部IP地址,但我只在NAT後面獲得本地IP地址。如何使用NSHost獲取外部IP地址?
NSArray *addresses = [[NSHost currentHost] addresses];
有沒有辦法打印公共地址?使用NSHost是一個好主意?
可能並不總是有可靠的方法來獲取您的公共IP,但OS X中的DNSService API將使用UPnP和/或NAT端口映射協議來獲取公共IP(除其他外)。說明如何使用C API的代碼在這裏顯示的有點大(50-60行),但有一些Apple示例代碼實現了一個很好的ObjC封裝功能,甚至提供了一對函數來直接返回公共IP地址的UInt32和NSString表示。
相關的代碼本身is located here,但你可能是最好的下載zip文件,包括PortMapper.h和PortMapper.m在你的項目中,並直接使用它們。那麼你需要做的是:
NSString * publicAddressString = [PortMapper findPublicAddress];
沒有可靠的方法來獲得您的公共IP。根據您的網絡拓撲,您可能無法依賴出站地址,原因有很多:IP地址池,動態路由,多層NAT,代理服務器等。
如果您曾經看過在主要組織的網絡拓撲圖中,這樣做。這很有啓發。 NAT,防火牆和所有其他「黑魔法」的重點在於允許網絡在您不知情的情況下管理地址(包括保護您)。
只有三種方法可以可靠地(可靠的是一個相對概念)獲取服務器的外部IP地址。第一個是作爲網絡上的神(並且確保你在詢問時將它們稱爲神),這將有助於你獲取信息。有時(並非總是),它是IP地址頂部字節的簡單映射,同時保留低位字節。有時它更復雜,但仍遵循可以使用的規則。請記住,這些規則可以隨時更改。
第二種方法是在網絡外部設置一個可以查詢的框,然後它可以讓您知道您的IP地址。
第三種是專門附加到外部DNS服務器(而不是您的公司之一)來檢索信息。
當然,你應該問需要來知道你的外部IP地址。 DNS的整個目的是避免不必擔心IP地址,只需通過域名引用機器。
我會添加第四種方法:NAT端口映射協議。這取決於你的網絡硬件,但我不熟悉細節。 – 2009-05-31 12:57:29
謝謝大家。我看到......我正在編寫一個實用程序來關注我的動態IP,現在我明白了爲什麼我沒有找到一個可靠的客戶端來這麼做。根據你的說明,我選擇了第二種方法,這對個人使用來說很好。 – 2009-05-31 13:36:06