在.NET中确定本地Intranet IP地址

时间:2012-08-15 10:24:50

标签: .net ip-address windows-networking

我正在尝试从该计算机上运行的代码获取计算机的本地Intranet ip 有明确的方法吗?

我尝试过获取所有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

但这对我来说似乎有点神奇,我宁愿.net完成这项工作,由于我安装了VirtualBox,它也会返回多个ips

我也尝试了以下

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 个答案:

答案 0 :(得分:3)

您无法可靠地使用单个IP,因为该计算机每个网卡可能有多个网卡或多个IP。例如,我的笔记本电脑同时有一个有线网卡和一个无线网卡,非常乐意通过DHCP从我的路由器获取两个本地IP。

此外,在一些奇特的网络设置(主要是企业环境)中,您可以拥有能够通过路由器与每个子网进行通信的不同子网的IP。我可能在办公大楼的#6楼层为192.168.6.X,楼层7为192.168.7.X然后让路由器允许跨多个子网的流量,尽管它们被子网掩码屏蔽掉了。

更好的策略是获取本地IP列表,过滤环回地址(127.0.0.1),然后尝试连接到目标计算机。

但是如果您只想将本地IP检测为“不在互联网上公开”,您可以尝试使用1跳的生存时间(TTL)ping公共地址(可能是您的网络服务器?)。这不会使它通过任何路由器,如果它存在,这意味着如果它不能以1跳或更少的速度到达公共互联网,表明它在防火墙后面,它将失败。

在stackoverflow上查看这个很棒的答案,其中包括源代码:Check if IP is in LAN (behind firewalls and routers)