Вопрос

Мы отслеживаем статистику использования сетевого интерфейса с помощью NetworkInterface.Получите v4statistics() в .NET 2.0.Это неверная статистика для подключений, по которым туннелируется VPN-трафик.Вместо этого - в случае VPN-клиента Cisco - использование просто приписывается новому сетевому интерфейсу, который просто выглядит как подключение Ethernet.

Сама Windows (по крайней мере, Vista) корректно добавляет статистику VPN к реальному физическому интерфейсу, поэтому при просмотре диалогового окна "Статус" исходного соединения отображается правильное количество байтов.Однако результаты вызова в .NET не объединяют трафик воедино.

Есть ли способ связать VPN-соединение обратно с сетевым соединением, по которому оно туннелируется?В противном случае, знает ли кто-нибудь, какой API используется в диалоговом окне состояния для получения правильной статистики?

На данный момент нам приходится вручную обнаруживать соединения, которые выглядят как VPN, и добавлять их использование к любому другому активному соединению, и это не кажется надежным решением.

Это было полезно?

Решение 3

Как предполагает Роб, ответ кроется в 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"]);
    }
}

Другие советы

Вот программа, написанная на Delphi (с полным источником и объяснением), который поможет вам собирать сетевую информацию, включая данные VPN.Это использование компоненты Indy с открытым исходным кодом, который также доступен для использования с C #.

Я бы посоветовал просмотреть исходный код, и вы найдете точные вызовы Windows API, которые он выполняет.Он в значительной степени зависит от IP Helper API (Ифлпапи).

Если вы ищете примеры только для C #, я бы посоветовал поискать в Google "C # и IpHlpApi".

С уважением

альтернативный текст http://z.about.com/d/delphi/1/0/k/2/112903_2.gif

Мне нужно будет проверить, когда я приступлю к работе, чтобы увидеть, как выглядит моя конфигурация.

Одна вещь, которую делает Cisco VPN, - это, если она настроена, отключение раздельного туннелирования.Это означает, что вам запрещен доступ к вашей локальной подсети по соединению, которое подключено к VPN.

Я могу видеть это, когда мое ethernet-соединение настроено с IP-адресом, но не имеет шлюза по умолчанию.

Предположим, что вы идентифицируете VPN-соединение, это соединение без шлюза будет вашим другим соединением.

Кроме того, заглядывали ли вы в какие-либо классы WMI?Возможно, Cisco VPN может взаимодействовать с классом WMI.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top