我们正在使用.NET 2.0中的NetworkInterface.GetIPv4Statistics()监控网络接口的使用情况统计信息。这不会报告通过隧道传输VPN流量的连接的正确统计信息。相反 - 在Cisco VPN客户端的情况下 - 使用仅仅归因于看起来像以太网连接的新网络接口。
Windows本身(至少是Vista)正确地将VPN统计信息添加到实际物理接口,因此查看原始连接的“状态”对话框会显示正确的字节数。但是,.NET中调用的结果不会将流量合并在一起。
有没有办法将VPN连接关联到通过其进行隧道传输的网络连接?如果不这样做,是否有人知道状态对话框正在使用哪个API来检索正确的统计信息?
目前我们不得不手动检测看起来像VPN的连接,并将其用途添加到其他任何活动连接中,这似乎不是一个强大的解决方案。
答案 0 :(得分:2)
Here's a program written in Delphi(完整的来源和解释)将帮助您收集网络信息,包括VPN数据。这是使用open-source Indy components,它也可用于C#。
我建议浏览源代码,然后你会发现它所做的确切的Windows API调用。它在IP Helper API(IPHlpApi)上依赖HEAVILY。
如果您正在寻找仅限C#的示例,我建议您为“C#和IpHlpApi”进行一些谷歌搜索。
此致
答案 1 :(得分:1)
我必须检查我什么时候去看看我的配置是什么样的。
Cisco VPN所做的一件事是,如果配置,则禁用拆分隧道。这意味着您无法访问连接到VPN的连接上的本地子网。
我可以看到这种情况,就是我的以太网连接配置了IP地址,但没有默认网关。
假设您识别VPN连接,那么无网关连接将是您的另一个连接。
另外,您是否查看了任何WMI类。 Cisco VPN可能与WMI类进行交互。
答案 2 :(得分:0)
正如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"]);
}
}