c# 使用sharpPcap制作的网络监视器应用程序,每次调用应显示一个msgbox的方法每次调用显示多个msgbox

Posted

技术标签:

【中文标题】c# 使用sharpPcap制作的网络监视器应用程序,每次调用应显示一个msgbox的方法每次调用显示多个msgbox【英文标题】:c# network monitor app made by using sharpPcap, Method which should display one msgbox per call showes multiple msgboxes per one call 【发布时间】:2018-01-21 18:45:45 【问题描述】:

我正在构建应显示每个进程的网络流量的应用程序。我正在使用 SharpPcap。

想法是开始在新线程上捕获网络流量,每个进程一个线程。它应该如何工作:在新线程上开始捕获,等待 2000 毫秒,停止捕获,在消息框中显示捕获的流量量(现在) ,结束线程。

问题:对于某些进程,消息框显示多次,这意味着该方法被调用的次数超出了应有的次数。我使用列表(我确保列表中的每个进程都是唯一的,没有错误那里)和foreach循环。

在 foreach 循环中调用 StartThreads 方法,针对列表中的每个进程。

 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;
    

我还注意到,有时,在调试模式下,我得到了 shappcap 异常:“线程在 00:00:02 后中止”,但我认为这并不重要。

【问题讨论】:

【参考方案1】:

从 DownloadForListView 中创建的所有变量中删除 'static' 关键字解决了这个问题。

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

【讨论】:

以上是关于c# 使用sharpPcap制作的网络监视器应用程序,每次调用应显示一个msgbox的方法每次调用显示多个msgbox的主要内容,如果未能解决你的问题,请参考以下文章

C#使用sharppcap实现网络抓包-----2

SharpPcap 可以用来在 C# 中找到我的网络中的 ip 摄像机吗

如何使用 Sharppcap 和 npcap 监视 Windows 环回适配器?

在 C# 中使用 SharpPCap 解析时,如何判断是不是以有限的快照长度捕获了 PCAPNG 文件?

SharpPcap - 传入的数据包被丢弃

C# FileSystemWatcher 监视仅由当前系统完成的网络驱动器上的更改