使用Pcap.net在示例时间内获取流量最多的网络接口

时间:2018-09-14 03:00:08

标签: c# pcap.net

我正在尝试使用Pcap.net包来分析在一个较小的采样周期(例如10秒)内跨多个网络接口的每秒通信量(以位为单位)。然后,我想根据结果计算每秒总字节数的平均值,然后通过加高关联的listBox项来指示哪个接口的流量最多。

我正在使用github包中的这个示例:Statistics Example

我需要同时为每个接口执行此操作,因此我正在启动一个方法,该方法最终在每个接口的单独线程中调用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); } 类末尾的注释掉的代码显示了我试图解决这个问题的方法。

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'
}

try:
    r = requests.head('http://moneycake.tistory.com/43', allow_redirects=False, headers=headers)
    print(r.status_code)
except requests.exceptions.RequestException as e:
    pass

1 个答案:

答案 0 :(得分:0)

似乎处理PacketSampleStatistics的方法应该是使用接口ID初始化的类的成员。