2009-05-31 67 views

回答

11

可能並不總是有可靠的方法來獲取您的公共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]; 
1

沒有可靠的方法來獲得您的公共IP。根據您的網絡拓撲,您可能無法依賴出站地址,原因有很多:IP地址池,動態路由,多層NAT,代理服務器等。

2

如果您曾經看過在主要組織的網絡拓撲圖中,這樣做。這很有啓發。 NAT,防火牆和所有其他「黑魔法」的重點在於允許網絡在您不知情的情況下管理地址(包括保護您)。

只有三種方法可以可靠地(可靠的是一個相對概念)獲取服務器的外部IP地址。第一個是作爲網絡上的神(並且確保你在詢問時將它們稱爲神),這將有助於你獲取信息。有時(並非總是),它是IP地址頂部字節的簡單映射,同時保留低位字節。有時它更復雜,但仍遵循可以使用的規則。請記住,這些規則可以隨時更改。

第二種方法是在網絡外部設置一個可以查詢的框,然後它可以讓您知道您的IP地址。

第三種是專門附加到外部DNS服務器(而不是您的公司之一)來檢索信息。

當然,你應該問需要來知道你的外部IP地址。 DNS的整個目的是避免不必擔心IP地址,只需通過域名引用機器。

+0

我會添加第四種方法:NAT端口映射協議。這取決於你的網絡硬件,但我不熟悉細節。 – 2009-05-31 12:57:29

+0

謝謝大家。我看到......我正在編寫一個實用程序來關注我的動態IP,現在我明白了爲什麼我沒有找到一個可靠的客戶端來這麼做。根據你的說明,我選擇了第二種方法,這對個人使用來說很好。 – 2009-05-31 13:36:06