【问题标题】:Determining the local intranet ip address in .NET在 .NET 中确定本地 Intranet ip 地址
【发布时间】:2012-08-15 10:24:49
【问题描述】:

我正在尝试从该机器上运行的代码中获取该机器的本地 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))

有人有更好的方法吗?

【问题讨论】:

  • 如果您告诉我们您打算如何使用此结果,我们可能会建议更好的选择。无法保证特定机器​​可能使用什么地址,它可能是多宿主的,它可能只是 IPv6 等等,所以当前的“过滤几个范围,希望只得到一个”将永远无法工作.
  • 它将被同一网络上的客户端使用,以使用 http 连接到该计算机
  • 而且机器名称不起作用?
  • 不,不知道为什么,客户端不是域的成员 - 本地 ip 有效,例如192.168.0.22,我可以检查哪些ip是v6,只有在不存在v4时才使用它们,它只是识别我需要的本地Intranet ip
  • 事实上,甚至可能没有域 - 这有什么区别吗?

标签: .net ip-address windows-networking


【解决方案1】:

您不能可靠地使用单个 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 上查看这个很棒的答案,其中包括源代码:Check if IP is in LAN (behind firewalls and routers)

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 2013-03-29
    • 2011-02-05
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多