我正在尝试从该计算机上运行的代码获取计算机的本地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))
有没有人有更好的方法?
答案 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)