2012-08-15 67 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)