3

我们正在使用 .NET 2.0 中的 NetworkInterface.GetIPv4Statistics() 监视网络接口的使用统计信息。这没有报告正在通过隧道传输 VPN 流量的连接的正确统计信息。相反 - 在 Cisco VPN 客户端的情况下 - 使用只是归因于一个看起来像以太网连接的新网络接口。

Windows 本身(至少是 Vista)正确地将 VPN 统计信息添加到实际物理接口,因此查看原始连接的“状态”对话框会显示正确的字节数。但是,.NET 中的调用结果不会将流量合并在一起。

有没有办法将 VPN 连接关联回通过其隧道传输的网络连接?如果做不到这一点,有谁知道状态对话框正在使用哪个 API 来检索正确的统计信息?

目前,我们不得不手动检测看起来像是 VPN 的连接,并将它们的使用添加到任何其他处于活动状态的连接中,这似乎不是一个可靠的解决方案。

4

3 回答 3

2

这是一个用 Delphi 编写的程序(带有完整的源代码和解释),它将帮助您收集网络信息,包括 VPN 数据。这是使用开源 Indy 组件,它也可用于 C#。

我建议浏览源代码,您会发现它所做的确切 Windows API 调用。它严重依赖 IP Helper API ( IPHlpApi )。

如果您正在寻找仅 C# 的示例,我建议您为“C# and IpHlpApi”做一些谷歌搜索。

问候

替代文字 http://z.about.com/d/delphi/1/0/k/2/112903_2.gif

于 2009-03-01T04:01:11.510 回答
1

当我开始工作时,我必须检查一下我的配置是什么样的。

Cisco VPN 所做的一件事是(如果已配置)禁用拆分隧道。这意味着您无法访问连接到 VPN 的连接上的本地子网。

我可以看到的方式是,我的以太网连接配置了 IP 地址,但没有默认网关。

假设您确定了 VPN 连接,则该无网关连接将是您的另一个连接。

另外,您是否查看过任何 WMI 类。Cisco VPN 可能会与 WMI 类交互。

于 2009-02-24T02:44:58.347 回答
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"]);
    }
}
于 2009-03-20T16:51:53.307 回答