确定 .NET 中的本地内网 IP 地址



我正在尝试从机器上运行的代码中获取该机器的本地内网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,它还返回多个 IP

我也尝试了以下方法

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))

没有人有更好的方法?

您无法可靠地使用单个 IP,因为计算机可能有多个网卡或每个网卡有多个 IP。例如,我的笔记本电脑同时具有有线网卡和无线网卡,并且很高兴通过DHCP从路由器中获取两个本地IP。

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

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

但是,如果您只想将本地 IP 检测为"在互联网上不公开",您可以尝试 ping 一个公共地址(也许是您的网络服务器?),生存时间 (TTL) 为 1 跳。如果存在路由器,这不会通过任何路由器,这意味着如果它无法在 1 跳或更短的时间内到达公共互联网,它将失败,表明它位于防火墙后面。

堆栈溢出上查看这个包含源代码的好答案:检查IP是否在LAN中(防火墙和路由器后面)

相关内容

  • 没有找到相关文章

最新更新