本文轉載自:http://blog.csdn.net/zhanjianshinian/article/details/8177851
public partial class NetJiankongForm2 : Form { public NetJiankongForm2() { InitializeComponent(); } private MyNetWorkMatchClass[] m_MNWMadapters; private MyNetWorkMonitor monitor; 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); //得到該適配器的上傳速度 } } public class MyNetWorkMonitor { private System.Timers.Timer Monitor_Timer; // 計時器事件執行每秒鍾刷新值在適配器。 private ArrayList m_AdaptersList; //該計算機的適配器列表。 private ArrayList m_MonitoredAdapters; //目前控制的適配器列表 public MyNetWorkMonitor() { m_AdaptersList = new ArrayList(); //用來保存獲取到的計算機的適配器列表 m_MonitoredAdapters = new ArrayList(); //運行的有效的適配器列表 ShowNetAdapter(); //列舉出安裝在該計算機上面的適配器 Monitor_Timer = new System.Timers.Timer(1000); Monitor_Timer.Elapsed += new ElapsedEventHandler(timer_ElapsedClick); } 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"); foreach (string InstanceName in PCCCategory.GetInstanceNames()) { 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() { 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) //控制該適配器開始工作 { 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)); } } } //一個安裝在計算機上的網絡適配器,該類可用於獲取網絡中的流量 public class MyNetWorkMatchClass { public override string ToString() { return m_strMatchName; } public string strMatchName { 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_lUpLoadSpeed / 1024.0; } } public double UploadSpeedKbps { get { return this.m_lUpLoadSpeed / 1024.0; } } private long m_lDownLoadNetValues1; //當前的下載速度,字節計算 private long m_lUploadNetValues1; //當前的上傳速度 private long m_lDownLoadNetValues2; //一秒前的下載速度,字節計算 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; } }
