4

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

有没有人有更好的方法?

4

1 回答 1

3

您不能可靠地使用单个 IP,因为机器可能有多个网卡或每个网卡有多个 IP。例如,我的笔记本电脑有一个有线网卡和一个无线网卡,并且很乐意通过 DHCP 从我的路由器获取两个本地 IP。

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

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

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

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

于 2012-08-20T21:29:26.227 回答