注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

C#网速监测  

2014-09-12 14:15:49|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

主要有两个类,其一是NetworkAdapter,该类的作用是获取本机网络适配器列表,并且可以通过该类的属性获取当前网速数据;其二是 NetworkMonitor,该类是通过.NET的PerformanceCounter(性能计数器组件)监测本机每一个网络适配器对应的当前网速状 况(翻译得不大好,具体还是看原汁原味的代码吧:))

NetworkAdapter类

  1. using System;  
  2. using System.Diagnostics;  
  3.   
  4. namespace NetWorkSpeedMonitor  
  5. {  
  6.     /// <summary>  
  7.     /// Represents a network adapter installed on the machine.  
  8.     /// Properties of this class can be used to obtain current network speed.  
  9.     /// </summary>  
  10.     public class NetworkAdapter  
  11.     {  
  12.         /// <summary>  
  13.         /// Instances of this class are supposed to be created only in an NetworkMonitor.  
  14.         /// </summary>  
  15.         internal NetworkAdapter(string name)  
  16.         {  
  17.             this.name = name;  
  18.         }  
  19.   
  20.         private long dlSpeed, ulSpeed;       // Download/Upload speed in bytes per second.  
  21.         private long dlValue, ulValue;       // Download/Upload counter value in bytes.  
  22.         private long dlValueOld, ulValueOld; // Download/Upload counter value one second earlier, in bytes.  
  23.   
  24.         internal string name;                               // The name of the adapter.  
  25.         internal PerformanceCounter dlCounter, ulCounter;   // Performance counters to monitor download and upload speed.  
  26.         /// <summary>  
  27.         /// Preparations for monitoring.  
  28.         /// </summary>  
  29.         internal void init()  
  30.         {  
  31.             // Since dlValueOld and ulValueOld are used in method refresh() to calculate network speed, they must have be initialized.  
  32.             this.dlValueOld = this.dlCounter.NextSample().RawValue;  
  33.             this.ulValueOld = this.ulCounter.NextSample().RawValue;  
  34.         }  
  35.         /// <summary>  
  36.         /// Obtain new sample from performance counters, and refresh the values saved in dlSpeed, ulSpeed, etc.  
  37.         /// This method is supposed to be called only in NetworkMonitor, one time every second.  
  38.         /// </summary>  
  39.         internal void refresh()  
  40.         {  
  41.             this.dlValue = this.dlCounter.NextSample().RawValue;  
  42.             this.ulValue = this.ulCounter.NextSample().RawValue;  
  43.   
  44.             // Calculates download and upload speed.  
  45.             this.dlSpeed = this.dlValue - this.dlValueOld;  
  46.             this.ulSpeed = this.ulValue - this.ulValueOld;  
  47.   
  48.             this.dlValueOld = this.dlValue;  
  49.             this.ulValueOld = this.ulValue;  
  50.         }  
  51.         /// <summary>  
  52.         /// Overrides method to return the name of the adapter.  
  53.         /// </summary>  
  54.         /// <returns>The name of the adapter.</returns>  
  55.         public override string ToString()  
  56.         {  
  57.             return this.name;  
  58.         }  
  59.         /// <summary>  
  60.         /// The name of the network adapter.  
  61.         /// </summary>  
  62.         public string Name  
  63.         {  
  64.             get { return this.name; }  
  65.         }  
  66.         /// <summary>  
  67.         /// Current download speed in bytes per second.  
  68.         /// </summary>  
  69.         public long DownloadSpeed  
  70.         {  
  71.             get { return this.dlSpeed; }  
  72.         }  
  73.         /// <summary>  
  74.         /// Current upload speed in bytes per second.  
  75.         /// </summary>  
  76.         public long UploadSpeed  
  77.         {  
  78.             get { return this.ulSpeed; }  
  79.         }  
  80.         /// <summary>  
  81.         /// Current download speed in kbytes per second.  
  82.         /// </summary>  
  83.         public double DownloadSpeedKbps  
  84.         {  
  85.             get { return this.dlSpeed / 1024.0; }  
  86.         }  
  87.         /// <summary>  
  88.         /// Current upload speed in kbytes per second.  
  89.         /// </summary>  
  90.         public double UploadSpeedKbps  
  91.         {  
  92.             get { return this.ulSpeed / 1024.0; }  
  93.         }  
  94.     }  
  95. }  

NetworkMonitor类

  1. using System;  
  2. using System.Timers;  
  3. using System.Collections;  
  4. using System.Diagnostics;  
  5.   
  6. namespace NetWorkSpeedMonitor  
  7. {  
  8.     /// <summary>  
  9.     /// The NetworkMonitor class monitors network speed for each network adapter on the computer,  
  10.     /// using classes for Performance counter in .NET library.  
  11.     /// </summary>  
  12.     public class NetworkMonitor  
  13.     {  
  14.         private Timer timer;                // The timer event executes every second to refresh the values in adapters.  
  15.         private ArrayList adapters;         // The list of adapters on the computer.  
  16.         private ArrayList monitoredAdapters;// The list of currently monitored adapters.  
  17.   
  18.         public NetworkMonitor()  
  19.         {  
  20.             this.adapters = new ArrayList();  
  21.             this.monitoredAdapters = new ArrayList();  
  22.             EnumerateNetworkAdapters();  
  23.   
  24.             timer = new Timer(1000);  
  25.             timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);  
  26.         }  
  27.         /// <summary>  
  28.         /// Enumerates network adapters installed on the computer.  
  29.         /// </summary>  
  30.         private void EnumerateNetworkAdapters()  
  31.         {  
  32.             PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface");  
  33.   
  34.             foreach (string name in category.GetInstanceNames())  
  35.             {  
  36.                 // This one exists on every computer.  
  37.                 if (name == "MS TCP Loopback interface")  
  38.                     continue;  
  39.                 // Create an instance of NetworkAdapter class, and create performance counters for it.  
  40.                 NetworkAdapter adapter = new NetworkAdapter(name);  
  41.                 adapter.dlCounter = new PerformanceCounter("Network Interface""Bytes Received/sec", name);  
  42.                 adapter.ulCounter = new PerformanceCounter("Network Interface""Bytes Sent/sec", name);  
  43.                 this.adapters.Add(adapter); // Add it to ArrayList adapter  
  44.             }  
  45.         }  
  46.   
  47.         private void timer_Elapsed(object sender, ElapsedEventArgs e)  
  48.         {  
  49.             foreach (NetworkAdapter adapter in this.monitoredAdapters)  
  50.                 adapter.refresh();  
  51.         }  
  52.         /// <summary>  
  53.         /// Get instances of NetworkAdapter for installed adapters on this computer.  
  54.         /// </summary>  
  55.         public NetworkAdapter[] Adapters  
  56.         {  
  57.             get { return (NetworkAdapter[])this.adapters.ToArray(typeof(NetworkAdapter)); }  
  58.         }  
  59.         /// <summary>  
  60.         /// Enable the timer and add all adapters to the monitoredAdapters list,   
  61.         /// unless the adapters list is empty.  
  62.         /// </summary>  
  63.         public void StartMonitoring()  
  64.         {  
  65.             if (this.adapters.Count > 0)  
  66.             {  
  67.                 foreach (NetworkAdapter adapter in this.adapters)  
  68.                     if (!this.monitoredAdapters.Contains(adapter))  
  69.                     {  
  70.                         this.monitoredAdapters.Add(adapter);  
  71.                         adapter.init();  
  72.                     }  
  73.   
  74.                 timer.Enabled = true;  
  75.             }  
  76.         }  
  77.         /// <summary>  
  78.         /// Enable the timer, and add the specified adapter to the monitoredAdapters list  
  79.         /// </summary>  
  80.         public void StartMonitoring(NetworkAdapter adapter)  
  81.         {  
  82.             if (!this.monitoredAdapters.Contains(adapter))  
  83.             {  
  84.                 this.monitoredAdapters.Add(adapter);  
  85.                 adapter.init();  
  86.             }  
  87.             timer.Enabled = true;  
  88.         }  
  89.         /// <summary>  
  90.         /// Disable the timer, and clear the monitoredAdapters list.  
  91.         /// </summary>  
  92.         public void StopMonitoring()  
  93.         {  
  94.             this.monitoredAdapters.Clear();  
  95.             timer.Enabled = false;  
  96.         }  
  97.         /// <summary>  
  98.         /// Remove the specified adapter from the monitoredAdapters list, and   
  99.         /// disable the timer if the monitoredAdapters list is empty.  
  100.         /// </summary>  
  101.         public void StopMonitoring(NetworkAdapter adapter)  
  102.         {  
  103.             if (this.monitoredAdapters.Contains(adapter))  
  104.                 this.monitoredAdapters.Remove(adapter);  
  105.             if (this.monitoredAdapters.Count == 0)  
  106.                 timer.Enabled = false;  
  107.         }  
  108.     }  
  109. }  

Form关键代码

  1. using NetWorkSpeedMonitor;  
  2.   
  3.         private NetworkAdapter[] adapters;  
  4.         private NetworkMonitor monitor;  
  5.   
  6.         private void FormMain_Load(object sender, System.EventArgs e)  
  7.         {  
  8.             monitor = new NetworkMonitor();  
  9.             this.adapters = monitor.Adapters;  
  10.             /* If the length of adapters is zero, then no instance  
  11.              * exists in the networking category of performance console.*/  
  12.             if (adapters.Length == 0)  
  13.             {  
  14.                 this.ListAdapters.Enabled = false;  
  15.                 MessageBox.Show("No network adapters found on this computer.");  
  16.                 return;  
  17.             }  
  18.             this.ListAdapters.Items.AddRange(this.adapters);  
  19.         }  
  20.   
  21.         private void ListAdapters_SelectedIndexChanged(object sender, System.EventArgs e)  
  22.         {  
  23.             monitor.StopMonitoring();  
  24.             // Start a timer to obtain new performance counter sample every second.  
  25.             monitor.StartMonitoring(adapters[this.ListAdapters.SelectedIndex]);  
  26.             this.TimerCounter.Start();  
  27.         }  
  28.   
  29.         private void TimerCounter_Tick(object sender, System.EventArgs e)  
  30.         {  
  31.             NetworkAdapter adapter = this.adapters[this.ListAdapters.SelectedIndex];  
  32.             /* The DownloadSpeedKbps and UploadSpeedKbps are double values. You can also  
  33.              * use properties DownloadSpeed and UploadSpeed, which are long values but  
  34.              * are measured in bytes per second. */  
  35.             this.LableDownloadValue.Text = String.Format("{0:n} kbps", adapter.DownloadSpeedKbps);  
  36.             this.LabelUploadValue.Text = String.Format("{0:n} kbps", adapter.UploadSpeedKbps);  
  37.         }  

运行效果:

 

原文地址:http://www.codeproject.com/KB/system/networkmonitorl.aspx

  评论这张
 
阅读(544)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017