2012-08-15 62 views
4

我想從機器上運行的代碼獲取本地局域網的機器內部網 有沒有一種確定的方法來做到這一點?在.NET中確定本地Intranet的IP地址

我試圖通過 10.0.0.0-10.255.255.255,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255

Dns.GetHostEntry(Dns.GetHostName()).AddressList 

讓所有的IP和過濾,但這似乎有點魔術對我來說,我寧願.NET所做的工作,它也返回多個IP地址,由於我有VirtualBox的安裝

我也曾嘗試以下

var localAddress = 
    (
     from ni in NetworkInterface.GetAllNetworkInterfaces() 
     where ni.NetworkInterfaceType != NetworkInterfaceType.Loopback 
       && hostEntry.HostName.EndsWith(string.Concat(".", ni.Name)) 
     let props = ni.GetIPProperties() 
     from unicastAddress in props.UnicastAddresses 
     where unicastAddress.Address.AddressFamily == AddressFamily.InterNetwork 
     select unicastAddress.Address).FirstOrDefault(); 

這可以工作,但它可以在其他網絡配置上工作嗎?

此位關注我hostEntry.HostName.EndsWith(string.Concat(".", ni.Name))

有沒有人有更好的辦法?

+1

如果你告訴我們你是如何計劃使用* *這個結果我們或許可以認爲更好的選擇。不能保證特定機器​​可能使用的地址是什麼,它可能是多宿主的,可能僅限於IPv6等,所以當前「過濾一定範圍,只希望得到一個」將永遠不會工作。 – 2012-08-15 10:27:16

+0

它將被同一網絡上的客戶端使用,使用http – 2012-08-15 10:34:20

+0

連接到該機器並且機器名稱不起作用? – 2012-08-15 12:42:18

回答

3

由於機器可能有多個網卡或每個網卡有多個IP,因此無法可靠地使用單個IP。例如,我的筆記本電腦同時擁有有線網卡和無線網卡,並且很高興通過DHCP從我的路由器獲取兩個本地IP。

同樣在一些奇特的網絡設置(主要是企業環境)中,您可以使用不同子網的IP通過路由器與每個子網進行通信。我可能在辦公大樓的樓層#6是192.168.6.X,樓層7是192.168.7.X,然後有一個路由器允許跨多個子網的流量,儘管它們被子網掩碼隔開。

更好的策略是獲取本地IP列表,篩選環回地址(127.0.0.1),然後嘗試連接到目標機器。

但是,如果你只是想檢測到一個本地IP爲「不在互聯網上公開」,你可以嘗試ping一個公共地址(也許你的web服務器?)與1跳的生存時間(TTL) 。如果有人存在,這將不會使其通過任何路由器,這意味着如果它不能在1跳或更少的地方到達公共因特網,則表明它在防火牆後面將失敗。

退房計算器上這個偉大的答案,其中包括源代碼:Check if IP is in LAN (behind firewalls and routers)