Получите сетевой интерфейс с наибольшим количеством трафика в течение периода выборки, используя Pcap.net - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь использовать пакет Pcap.net для анализа количества трафика в битах в секунду через несколько сетевых интерфейсов в течение небольшого периода выборки (например, 10 секунд). Затем я хотел бы вычислить среднее значение общего количества байтов в секунду из результатов, а затем указать, какой интерфейс имеет больше трафика, выделив связанный элемент listBox.

Я работаю с этим примером из пакета github: Пример статистики

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

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

Я заполняю список и запускаю новый поток для каждого интерфейса следующим образом:

public Form1()
{
    InitializeComponent();
    // Retrieve the device list from the local machine

    IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;

    if (allDevices.Count == 0)
    {
        Console.WriteLine("No interfaces found! Make sure WinPcap is installed.");
        return;
    }

    // Print the list
    for (int i = 0; i != allDevices.Count; ++i)
    {
        LivePacketDevice device = allDevices[i];
        Console.Write((i + 1) + ". " + device.Name);
        int pcapInt = i + 1;
        if (device.Description != null)
        {
            Console.WriteLine(" (" + device.Description + ")");
            listBox1.Items.Add((pcapInt) + ". " + device.Description);
        }
        else
            Console.WriteLine(" (No description available)");
    }


    foreach (var netInts in listBox1.Items)
    {
        int curIndex = 1 + listBox1.Items.IndexOf(netInts);
        Console.WriteLine(curIndex);
        Thread getStats = new Thread(() => GetNetStatistics(curIndex));
        Console.WriteLine("Interface index: " + curIndex);
        getStats.Start();
    }
}

Это создает новый поток для каждого сетевого интерфейса и записывает биты в секунду в консоль, запуская метод с именем GetNetStatistics. Затем этот метод запускает StatisticsHandler, который использует класс PacketSampleStatistics для записи битов в секунду для каждого интерфейса в консоль в своем собственном потоке, который работает.

Я попытался вызвать делегата для обновления объектов в главной форме, что работает, если я делаю это только для одного сетевого интерфейса / одного потока за раз. Но я должен быть в состоянии сделать это для каждого сетевого интерфейса одновременно.

Мой закомментированный код в конце PacketSampleStatistics класса показывает мои попытки выяснить это.

private void StatisticsHandler(PacketSampleStatistics statistics)
{

    // Current sample time
    DateTime currentTimestamp = statistics.Timestamp;

    // Previous sample time
    DateTime previousTimestamp = _lastTimestamp;

    // Set _lastTimestamp for the next iteration
    _lastTimestamp = currentTimestamp;

    // If there wasn't a previous sample than skip this iteration (it's the first iteration)
    if (previousTimestamp == DateTime.MinValue)
        return;

    // Calculate the delay from the last sample
    double delayInSeconds = (currentTimestamp - previousTimestamp).TotalSeconds;

    // Calculate bits per second
    double bitsPerSecond = Math.Truncate(statistics.AcceptedBytes * 8 / delayInSeconds);

    // Calculate packets per second
    double packetsPerSecond = statistics.AcceptedPackets / delayInSeconds;

    // Print timestamp and samples
    Console.WriteLine(statistics.Timestamp + " BPS: " + bitsPerSecond + " PPS: " + packetsPerSecond);

    //invoke delegate to update main form
    //MethodInvoker inv = delegate
    //{
        //bytesSecond.Text = bitsPerSecond.ToString();
        //listBox1.Items[0] = listBox1.Items[0] + bitsPerSecond.ToString();
    //};
    //this.Invoke(inv);

}

1 Ответ

0 голосов
/ 10 ноября 2018

Кажется, что метод, который обрабатывает PacketSampleStatistics, должен быть членом класса, который инициализируется с идентификатором интерфейса.

...