我们使用.NET 2.0中的NetworkInterface.GetIPv4Statistics()来监视networking接口的使用情况统计信息。 这不报告正在隧道VPN通信的连接正确的统计信息。 相反 – 在Cisco VPN客户端的情况下 – 这种使用仅仅归因于一个新的networking接口,就像一个以太网连接。
Windows本身(Vista,至less)将VPN统计信息正确地添加到实际的物理接口,因此查看原始连接的“状态”对话框会显示正确的字节数。 但是,.NET调用的结果不会将stream量合并在一起。
有没有办法将VPN连接关联到它所通过的networking连接? 如果没有,那么是否有人知道状态对话框正在使用哪个API来检索正确的统计信息?
目前,我们不得不手动检测连接,看起来像是VPN,并将其用途添加到任何其他连接处于活动状态,这似乎不是一个可靠的解决scheme。
这是一个用Delphi编写的程序 (有完整的源代码和解释),可以帮助你收集网络信息,包括VPN数据。 这是使用开源的Indy组件 ,它也可用于C#。
我建议浏览源代码,你会发现它的确切的Windows API调用。 它依赖于IP Helper API( IPHlpApi )上的HEAVILY 。
如果你正在寻找C#的例子,我会建议做一些谷歌的“C#和IpHlpApi”。
问候
我必须检查什么时候开始工作,看看我的配置是什么样的。
Cisco VPN做的一件事情是,如果配置,禁用分裂隧道。 这意味着您无法访问连接到VPN的连接上的本地子网。
我可以看到这一点,是当我的以太网连接配置了IP地址,但没有默认网关。
假设您确定VPN连接,那么无网关连接将是您的其他连接。
另外,你有没有看过任何WMI类。 思科VPN可能与WMI类交互。
正如Rob所言,答案就在于WMI。 Win32_PerfFormattedData_RemoteAccess_RasPort
似乎是Windows自己使用的 – 数字是相同的,字节的字节,无论VPN是否启动。
我测试了:
static class Program { static void Main() { var query = new WqlEventQuery("__InstanceModificationEvent", TimeSpan.FromSeconds(1), "TargetInstance ISA 'Win32_PerfFormattedData_RemoteAccess_RasPort' AND TargetInstance.BytesReceived > 0"); var watcher = new ManagementEventWatcher(query); watcher.EventArrived += EventArrived; watcher.Start(); Console.ReadLine(); } static void EventArrived(object sender, EventArrivedEventArgs e) { var mo = e.NewEvent["TargetInstance"] as ManagementBaseObject; Console.WriteLine("{0:#,0}: {1:#,0} bytes sent, {2:#,0} bytes received", mo["Name"], mo["BytesTransmitted"], mo["BytesReceived"]); } }