我正在用 C# 编写一个程序,需要监视当前使用的互联网带宽量,以便在互联网使用率较低时进行后台上传。如何自动判断哪个网络适配器连接到互联网?
当我阅读此页面时,我最终点击了 MSDN 链接,在那里我找到了 GetBestInterface 函数。我可以用它来找到连接到互联网的适配器
检查路由表并查找具有默认路由(到
0.0.0.0
的路由)的接口 - 这是连接到更广阔世界的接口(如果有)。
您可以使用WMI查询所有适配器并查看连接的是哪一个。
本文向您展示了如何在 VB.Net 中执行此操作(非常容易转移到 C#)。
适配器在未连接到互联网时可能会通过多种方式显示为“已连接到互联网”。相反,它也有可能“未连接到互联网”但仍然处于连接状态。
就像生活中的许多事情一样,“布丁的好坏在于吃”如果你想知道你们是否有联系,你需要尝试与某些东西交谈。
我喜欢 time.gov,因为它返回一小段包含当前时间的 XML,这样您就可以确保您实际上正在连接到网络,并且没有获取某种缓存数据或重定向到强制门户。
只需循环浏览适配器,看看哪个适配器实际上具有连接性。
使用下面的代码片段获取当前活动的网络适配器。
using System.Net.NetworkInformation;
using System.Linq;
class Program
{
static void Main(string[] args)
{
NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(o => o.OperationalStatus == OperationalStatus.Up && o.NetworkInterfaceType != NetworkInterfaceType.Tunnel && o.NetworkInterfaceType != NetworkInterfaceType.Loopback);
if (networkInterface != null)
{
Console.WriteLine(networkInterface.Name);
}
}
}
还有一个经常有效的技巧:由于虚拟地址通常由以 PC 为主机的虚拟化软件使用,因此虚拟接口有一个网关地址。这意味着虚拟接口的 v4 IP 将以 .1 结尾,或更准确地说,它是该接口子网掩码内的最低地址。所以
<IP> and (not MASK)
将为 1.
没有官方规定网关地址必须为1,但这是一个广泛使用的标准。