我正在尝试使用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
答案 0 :(得分:0)
似乎处理PacketSampleStatistics
的方法应该是使用接口ID初始化的类的成员。