2017-08-13 72 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'关键字解决了这个问题。

所有线程都访问相同的变量,而不是为每个线程创建新的局部变量。

相关问题