2017-08-13 74 views
1

Im應用程序應顯示每個進程的網絡流量。使用SharpPcap。c#使用sharpPcap製作的網絡監視器應用程序,每次調用應顯示一個msgbox的方法每次調用顯示多個msgboxes

想法是開始捕獲新線程上的網絡流量,每個進程有一個線程。它應該如何工作:在新線程上啓動捕獲,等待2000毫秒,停止捕獲,在消息框中顯示捕獲的流量),結束線程。

問題:對於某些進程消息框顯示多次也就是說方法被調用的次數比它應該be.Im使用列表(我確信,在列表中的每個過程都是獨特的,沒有任何的錯誤)和foreach循環。

enter image description here

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

回答

1

從DownloadForListView中創建的所有變量中除去'static'關鍵字解決了這個問題。

所有線程都訪問相同的變量,而不是爲每個線程創建新的局部變量。

相關問題