2013-12-19 50 views
-3

我想寫與功能的功能描述如下使用C++或C#區分本地IP和WAN IP?

bool isLocalIp(String _ip); 
_ip: The string with a ip format or a domain format (ex: 112.42.11.44 or http://abc.def.com/) 
Return: True if the _ip is Local IP, False if _ip is WAN IP 

我已經搜查,但我沒有找到這方面有任何的話題。 有人可以告訴我如何寫這個功能?

非常感謝,

牛逼&牛逼

回答

2

本地IP與WAN IP是一個定義不明確的概念(充其量)。舉例來說,VPN連接可以爲通過WAN連接的計算機提供「本地」IP地址。

也就是說,基本思想相當簡單。子網掩碼專門用於此目的。您通常從您的本地IP地址開始,並查找其他地址是否爲本地IP地址。要做到這一點,你需要每個地址與子網掩碼and,比較結果。如果它們不相同,則它們位於不同的子網上。

但是,請注意,機器可能是多宿主機,這意味着它有兩個或更多適配器,其中每個適配器可能位於不同的子網上。所以,你真的想得到所有本地適配器的列表,並檢查每個地址。

這可能意味着也可能不意味着它確實是WAN連接。舉個例子,在一家像樣大小的公司的校園裏,你可能有許多子網,至少在某種程度上都是本地的。

然而,對於一個典型的家庭用戶來說,這將工作得很好。路由器一側的所有東西都將使用本地子網,而路由器另一端的所有東西都會在本地子網外有一些地址。

在C++中,您可以獲取適配器的列表以及GetIpAddrTable的每個適配器的地址和子網掩碼。

這一切都取決於您使用數字IP地址。如果您有域名,則首先需要先將其解析爲數字IP地址,例如gethostbynamegetaddrinfo

另外請注意,我上面描述的實際上是IPv4。 IPv6排序有一個相似的概念,但細節足夠不同,它幾乎肯定需要單獨的代碼。

+0

謝謝!傑瑞棺材。 – TTGroup

1

本地IP地址通常是私有IP地址,因此在10.x.x.x192.168.x.x的範圍內,和172.16.0.0 - 172.31.255.255

但是,本地IP可以一樣好成爲公衆知識產權,在這種情況下,您需要執行類似tracert的事情並解釋結果。