共计 2860 个字符,预计需要花费 8 分钟才能阅读完成。
1、前言
最近做项目需要用到监测网速及流量,我经过百度和墙内谷歌都没能快速发现监测 IPV6 流量和网速的用例;也经过自己的一番查询和调试,浪费了不少时间,现在作为经验分享出来希望大家指正。
2、C# 代码
using System.Net.NetworkInformation;
using System.Timers;
namespace Monitor
{
public class MonitorNetwork
{public string UpSpeed { get; set;}
public string DownSpeed {get; set;}
public string AllTraffic {get; set;}
private string NetCardDescription {get; set;}
// 建立连接时上传的数据量
private long BaseTraffic {get; set;}
private long OldUp {get; set;}
private long OldDown {get; set;}
private NetworkInterface networkInterface {get; set;}
private Timer timer = new Timer() { Interval = 1000};
public void Close()
{timer.Stop();
}
public MonitorNetwork(string netCardDescription)
{
timer.Elapsed += Timer_Elapsed;
NetCardDescription = netCardDescription;
timer.Interval = 1000;
}
public bool Start()
{
networkInterface = null;
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (var var in nics)
{if (var.Description.Contains(NetCardDescription))
{
networkInterface = var;
break;
}
}
if (networkInterface == null)
{return false;}
else
{BaseTraffic = (networkInterface.GetIPStatistics().BytesSent +
networkInterface.GetIPStatistics().BytesReceived);
OldUp = networkInterface.GetIPStatistics().BytesSent;
OldDown = networkInterface.GetIPStatistics().BytesReceived;
timer.Start();
return true;
}
}
private string[] units = new string[] {"KB/s","MB/s","GB/s"};
private void CalcUpSpeed()
{long nowValue = networkInterface.GetIPStatistics().BytesSent;
int num = 0;
double value = (nowValue - OldUp) / 1024.0;
while (value > 1023)
{value = (value / 1024.0);
num++;
}
UpSpeed = value.ToString("0.0") + units[num];
OldUp = nowValue;
}
private void CalcDownSpeed()
{long nowValue = networkInterface.GetIPStatistics().BytesReceived;
int num = 0;
double value = (nowValue - OldDown) / 1024.0;
while (value > 1023)
{value = (value / 1024.0);
num++;
}
DownSpeed = value.ToString("0.0") + units[num];
OldDown = nowValue;
}
private string[] unitAlls = new string[] {"KB", "MB", "GB" ,"TB"};
private void CalcAllTraffic()
{
long nowValue = OldDown+OldUp;
int num = 0;
double value = (nowValue- BaseTraffic) / 1024.0;
while (value > 1023)
{value = (value / 1024.0);
num++;
}
AllTraffic = value.ToString("0.0") + unitAlls[num];
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{CalcUpSpeed();
CalcDownSpeed();
CalcAllTraffic();}
}
}
3、胡说八道
虽然没能直接快速地百度到方法,但是实现这个需求的时候,心里是有个谱,Windows 系统能监测到这个网速和流量,没理由实现不了,只需要一个方法将这个信息读取出来就好。最后实现这个需求是利用了 System.Net.NetworkInformation 这个程序集,但是这个程序集没有只接提供网速监测的方法,而是提供了接收和发送数据量的属性,需要自己计算出即使网速,所以这个网速不是特别的准确。
这个程序集其实一开始就看到了,前辈方法中使用的是 IPv4InterfaceStatistics 类中的 BytesReceived 属性和 BytesSent 属性实现的,但是在这个程序集里没有对应的 IPv6 类,恍恍惚惚。
然后呢,我就下意识以为这个程序集比较老旧,不支持 IPv6 统计信息读取,然后也是各种搜索无果,之后呢不死心想再来研究研究,东点点西瞅瞅,然后在 NetworkInterface 类中发现了一个 GetIPStatistics() 方法,它的描述是“获取此 NetworkInterface 实例的 IP 统计信息。”。
然后就顺理成章的事了,根据 GetIPStatistics() 返回的 IPInterfaceStatistics 实例中的 BytesReceived 属性和 BytesSent 属性就能获取到收发的数据总量,然后根据这个信息就能计算出大约的网速。
经测试,利用 IPInterfaceStatistics 实例是能读取到 IPv4 和 IPv6 的总数据量的,因为这次的需求就是监测总量,如果需要单独监测 IPv6 的可以用总量减去 IPv4 部分。
4、后记
老师以前喊我认真念书,我心想有百度还不够吗,再念能有百度聪明,有百度懂得多,后来渐渐明白,百度懂得多都是前辈的搬砖添瓦来的,共勉。
参考资料
System.Net.NetworkInformation 命名空间