3

.NET 2.0 で NetworkInterface.GetIPv4Statistics() を使用して、ネットワーク インターフェイスの使用統計を監視しています。これは、VPN トラフィックがトンネリングされている接続の正しい統計を報告していません。代わりに (Cisco VPN クライアントの場合)、イーサネット接続のように見える新しいネットワーク インターフェイスが使用されているだけです。

Windows 自体 (少なくとも Vista) は VPN 統計を実際の物理インターフェイスに正しく追加するため、元の接続の [ステータス] ダイアログを表示すると正しいバイト数が表示されます。ただし、.NET での呼び出しの結果は、トラフィックをマージしません。

VPN 接続を、それがトンネリングされているネットワーク接続に関連付ける方法はありますか? それができない場合、ステータスダイアログで正しい統計を取得するためにどの API が使用されているか知っている人はいますか?

現時点では、VPN のように見える接続を手動で検出し、その使用法を他のアクティブな接続に追加する必要がありますが、これは堅牢なソリューションとは思えません.

4

3 に答える 3

1

仕事に着いたら、設定がどのように見えるかを確認する必要があります。

Cisco VPN が行うことの 1 つは、構成されている場合、スプリット トンネリングを無効にすることです。つまり、VPN に接続されている接続でローカル サブネットにアクセスできないということです。

これを確認できる方法は、イーサネット接続が IP アドレスで構成されているが、デフォルト ゲートウェイがない場合です。

VPN 接続を識別すると仮定すると、そのゲートウェイのない接続がもう 1 つの接続になります。

また、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 に答える