c#利用PerformanceCounter進行網卡流量監控

PerformanceCounter基礎知識:

在這裏插入圖片描述

參考

Performance Counter的使用

利用PerformanceCounter進行網卡流量監控

方法一:利用PerformanceCounter實例.NextValue()計算網卡下載速率
NextValue()使用注意(文章末尾)

namespace GPS222
{
    public partial class Form2 : Form
    {
        private PerformanceCounter mCounter;//當前計數器
        private void begin_n_Click(object sender, EventArgs e)
        {
              timer2_net.Interval = 1000;//。1秒一次timer2_Tick事件
              timer2_net.Enabled = true;
             //初始化Counter
             PerformanceCounterCategory pcCategory = new PerformanceCounterCategory("Network Interface");
             string[] iNames = pcCategory.GetInstanceNames();//此函數第一次執行特別耗時(不知道爲什麼)
             PerformanceCounter[] pCounters = pcCategory.GetCounters(iNames[1]);//iNames[0]爲"ASIX AX88772C USB2.0 to Fast Ethernet Adapter";iNames[1]爲"Intel[R] Ethernet Connection [7] I219-V"
             //給網絡監控計數器賦值
             mCounter = pCounters[0];
             mCounter.NextValue();//初始值  
       }
       private void timer2_net_Tick(object sender, EventArgs e)
       {                         
            double SpeedKbps = mCounter.NextValue() * 8 / 1000;
            if ((SpeedKbps / 1000) > 1)
            {
                SpeedSendToolLabel.Text = String.Format("{0:f1} Mbps", SpeedKbps / 1000); //得到該適配器的上傳速度
            }
            else
            {
                SpeedSendToolLabel.Text = String.Format("{0:f1} Kbps", SpeedKbps); //得到該適配器的上傳速度
            }
       }       

方法二(繁瑣):自定義了兩個類:MyNetWorkMatchClass和MyNetWorkMonitor,利用PerformanceCounter實例.NextSample().RawValue自行計算網卡上傳下載速率(CaculateAndRefresh()函數)
在這裏插入圖片描述

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Collections;
using System.Timers;
using System.Diagnostics;//Stopwatch\PerformanceCounter



namespace WindowsFormsApplication2
{
    public partial class NetJiankongForm2 : Form
    {
        private MyNetWorkMatchClass[] m_MNWMadapters;
        private MyNetWorkMonitor monitor;
        public NetJiankongForm2()
        {
            InitializeComponent();
        }
        private void NetJiankongForm2_Load(object sender, EventArgs e)
        {
            monitor = new MyNetWorkMonitor();
            m_MNWMadapters = monitor.Adapters; //獲得控制器MyNetWorkMonitor上所有計算機的適配器列表

            if (m_MNWMadapters.Length == 0)
            {
                listBox1.Enabled = false;
                MessageBox.Show("在計算機上沒有找到網絡適配器");
                return;
            }

            listBox1.Items.AddRange(m_MNWMadapters);
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e) //選中其中一個適配器
        {
                monitor.StopMonitoring();
                monitor.StartMonitoring(m_MNWMadapters[listBox1.SelectedIndex]); //控制該適配器開始工作
                this.timer1.Start(); //計時開始
        }

        private void timer1_Tick(object sender, EventArgs e) //計時開始,用於每秒鐘改變顯示速度
        {

                MyNetWorkMatchClass adapter = m_MNWMadapters[listBox1.SelectedIndex]; //該適配器
                textBox_Down.Text = String.Format("{0:n} kbps", adapter.DownloadSpeedKbps); //得到該適配器的下載速度
                textBox_Up.Text = String.Format("{0:n} kbps", adapter.UploadSpeedKbps); //得到該適配器的上傳速度
                
        } 
    }
    class MyNetWorkMonitor
    {
        private System.Timers.Timer Monitor_Timer; // 計時器事件執行每秒鐘刷新值在適配器。
        private ArrayList m_AdaptersList; //該計算機的適配器列表。
        private ArrayList m_MonitoredAdapters; //目前控制的(需要Monitor的)適配器列表

    class MyNetWorkMonitor
    {
        private System.Timers.Timer Monitor_Timer; // 計時器事件執行每秒鐘刷新值在適配器。
        private ArrayList m_AdaptersList; //該計算機的適配器列表。
        private ArrayList m_MonitoredAdapters; //目前控制的(需要Monitor的)適配器列表
        public MyNetWorkMonitor()
        {    
             m_AdaptersList = new ArrayList(); //用來保存獲取到的計算機的適配器列表    
             m_MonitoredAdapters = new ArrayList(); //運行的有效的(需要Monitor的)適配器列表
            ShowNetAdapter(); //列舉出安裝在該計算機上面的適配器
            Monitor_Timer = new System.Timers.Timer(1000);
            Monitor_Timer.Elapsed += new ElapsedEventHandler(timer_ElapsedClick);//StartMonitoring方法中開啓時鐘
        }
        private void timer_ElapsedClick(object sender, ElapsedEventArgs e) //用於每秒鐘刷新速度 
        {
            foreach (MyNetWorkMatchClass adapter in m_MonitoredAdapters) //每秒鐘遍歷有效的網絡適配器
            {
                adapter.CaculateAndRefresh(); //刷新上傳下載速度 
            }
        }
        private void ShowNetAdapter() //列舉出安裝在該計算機上面的適配器方法
        {
            PerformanceCounterCategory PCCCategory = new PerformanceCounterCategory("Network
Interface");
            string[] InstanceNames = PCCCategory.GetInstanceNames();
            foreach (string InstanceName in InstanceNames)
            {
                if (InstanceName == "MS TCP Loopback interface")//?
                    continue;
                // 創建一個實例Net workAdapter類別,並創建性能計數器它。
                MyNetWorkMatchClass myMNWMadapter = new MyNetWorkMatchClass(InstanceName);
                myMNWMadapter.m_Performance_Down = new PerformanceCounter("Network
Interface", "Bytes Received/sec", InstanceName);
                myMNWMadapter.m_Performance_Up= new PerformanceCounter("Network
Interface", "Bytes Sent/sec", InstanceName);               
                m_AdaptersList.Add(myMNWMadapter);
            }
        }
        public void StartMonitoring()//控制適配器開始工作(開啓Monitor_Timer時鐘)
        {
            if(m_AdaptersList.Count > 0)//魯棒性(防崩潰)
            {
                foreach (MyNetWorkMatchClass myMNWMadapter in m_AdaptersList)
                    if(!m_MonitoredAdapters.Contains(myMNWMadapter))
                    {                       
                        m_MonitoredAdapters.Add(myMNWMadapter);
                        myMNWMadapter.Start();
                    }
                Monitor_Timer.Enabled = true;
            }       
        }       
        public void StartMonitoring(MyNetWorkMatchClass myMNWMadapter) //控制該適配器開始工作(開啓Monitor_Timer時鐘)
       {
            if(!m_MonitoredAdapters.Contains(myMNWMadapter))
            {               
                m_MonitoredAdapters.Add(myMNWMadapter);
                myMNWMadapter.Start(); //該適配器調用自己函數開始工作 
            }
            Monitor_Timer.Enabled = true;       
        }
       public void StopMonitoring()     
       {
            m_MonitoredAdapters.Clear();
            Monitor_Timer.Enabled = false;
       }
       public void StopMonitoring(MyNetWorkMatchClass adapter)
       {
            if(m_MonitoredAdapters.Contains(adapter))
               m_MonitoredAdapters.Remove(adapter);
            if(m_MonitoredAdapters.Count == 0)
               Monitor_Timer.Enabled = false;
       }
       public MyNetWorkMatchClass[] Adapters //該控制類所控制的找出所有適配器的適配器列表
       {
            get
            {
                return (MyNetWorkMatchClass[])m_AdaptersList.ToArray(typeof(MyNetWorkMatchClass));
            }
       }
   }
   class MyNetWorkMatchClass
   {
       public override string ToString()
       {
            return m_strMatchName;
       }
       public string strMatchName//"ASIX AX88772C USB2.0 to Fast Ethernet Adapter"或"Intel[R] Ethernet Connection [7] I219-V"
       {
            get
            {
                return m_strMatchName;
            }
       }
       public long DownloadSpeed
       {
            get
            {
                return m_lDownLoadSpeed;
            }       
       }
       public long UploadSpeed
       {
            get
            {
                return m_lUpLoadSpeed;
            }
       }
       public double DownloadSpeedKbps
       {
            get
            {
                return this.m_lDownLoadSpeed*8/ 1000.0;//理論上應除以1024,但實際除以1000才與性能管理器中所顯示吞吐量一致
            }
       } 
       public double UploadSpeedKbps
       {
            get
            {
                return this.m_lUpLoadSpeed*8 /1000.0;//理論上應除以1024,但實際除以1000才與性能管理器中所顯示吞吐量一致
            }
       }
       private long m_lDownLoadNetValues1; //當前的下載速度,***字節***計算(須*8變爲bit才與性能管理器中所顯示吞吐量一致)
       private long m_lUploadNetValues1; //當前的上傳速度
       private long m_lDownLoadNetValues2; //一秒前的下載速度,***字節***計算(須*8變爲bit才與性能管理器中所顯示吞吐量一致)
       private long m_lUploadNetValues2; //一秒前的上傳速度
       private string m_strMatchName; //此適配器的名字
       internal PerformanceCounter m_Performance_Down; //控制下載速度的流量計算中心
       internal PerformanceCounter m_Performance_Up; // //控制上傳速度的流量計算中心
       private long m_lDownLoadSpeed; //每秒鐘下載速度
       private long m_lUpLoadSpeed; //每秒鐘上傳速度
       public MyNetWorkMatchClass(string strComputerNetName)
       {
            m_lDownLoadNetValues1 = 0;
            m_strMatchName =strComputerNetName;
            m_lUploadNetValues1 = 0;
            m_lDownLoadNetValues2 = 0;
            m_lUploadNetValues2 = 0;
       }
       //該適配器準備控制的方法函數
       public void Start()
       {
            m_lUploadNetValues1 =m_Performance_Up.NextSample().RawValue;
            m_lDownLoadNetValues1 =m_Performance_Down.NextSample().RawValue;
       }
       public void CaculateAndRefresh() //計算速度
       {
            m_lDownLoadNetValues2 =m_Performance_Down.NextSample().RawValue;
            m_lUploadNetValues2 =m_Performance_Up.NextSample().RawValue;
            m_lDownLoadSpeed =m_lDownLoadNetValues2 - m_lDownLoadNetValues1;
            m_lUpLoadSpeed = m_lUploadNetValues2- m_lUploadNetValues1;
            m_lDownLoadNetValues1 =m_lDownLoadNetValues2;
            m_lUploadNetValues1 =m_lUploadNetValues2;
       }
   }
}

參考

求助:用c#怎麼測網卡的吞吐量,急用
C#流量監控源代碼
C# 利用性能計數器監控網絡狀態

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章