Я пытаюсь использовать пакет 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);
}