1
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後中止」,但我不認爲這很重要。