c#使用sharpPcap制作的网络监视器应用程序,每次调用应显示一个msgbox的方法每次调用显示多个msgboxes
问题描述:
Im应用程序应显示每个进程的网络流量。使用SharpPcap。c#使用sharpPcap制作的网络监视器应用程序,每次调用应显示一个msgbox的方法每次调用显示多个msgboxes
想法是开始捕获新线程上的网络流量,每个进程有一个线程。它应该如何工作:在新线程上启动捕获,等待2000毫秒,停止捕获,在消息框中显示捕获的流量),结束线程。
问题:对于某些进程消息框显示多次也就是说方法被调用的次数比它应该be.Im使用列表(我确信,在列表中的每个过程都是独特的,没有任何的错误)和foreach循环。
方法StartThreads就是所谓的foreach循环,在列表中的每个过程。
void StartThreads()
{
//filter gets created
IPAddress[] IpAddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
string ip = IpAddressList[0].ToString();
string filterReceived = "dst host " + ip + " and " + filter_partReceived;
DownloadForListview procDownload = new DownloadForListview(filterReceived, 2,processIDq,ReturnDevice());
Thread t2 = new Thread(() => procDownload.ReceivedPackets());
t2.IsBackground = true;
t2.Start();
}
}
线程应该捕获网络流量:
class DownloadForListview
{
private static string FilterDownload;
private static int adapterIndex;
private static int ProcessID;
ICaptureDevice uredaj;
protected static long dataLenght;
protected static double dataPerSec;
public DownloadForListview(string filter, int adapterId,int pid,ICaptureDevice d)
{
uredaj = d;
FilterDownload = filter;
adapterIndex = adapterId;
ProcessID = pid;
}
public void ReceivedPackets()
{
uredaj.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketReceived);
uredaj.Filter = FilterDownload;
uredaj.StartCapture();
Thread.Sleep(2000);
uredaj.StopCapture();
dataPerSec = Math.Round(dataLenght/2d,3);
MessageBox.Show("Pid:"+ProcessID+"->" + FilterDownload+"->" + dataLenght.ToString());
}
private static void device_OnPacketReceived(object sender, CaptureEventArgs e)
{
dataLenght += e.Packet.Data.Length;
}
}
我也注意到,有时,在调试模式下,我得到sharppcap例外:“线程00:00:02后中止”,但我不认为这很重要。
答
从DownloadForListView中创建的所有变量中除去'static'关键字解决了这个问题。
所有线程都访问相同的变量,而不是为每个线程创建新的局部变量。