如何在C#.NET中获得准确的下载/上传速度?

我想通过使用C#.NET的网络接口获得准确的下载/上传速度我知道它可以使用GetIPv4Statistics().BytesReceived来计算GetIPv4Statistics().BytesReceived并让线程暂停一段时间。 但它没有给出我在浏览器中得到的输出。

通过查看您在NetworkInterface.GetIPv4Statistics()中发布的问题的另一个答案.BytesReceived – 它返回什么? 我认为问题可能是你使用的是小间隔。 我相信计数器只计算整个软件包,如果您正在下载文件,软件包可能会大到64 KB65,535 bytes ,IPv4最大软件包大小),如果您的最大下载吞吐量为60 KB/s ,您测量的间隔为200 ms

假设您的速度是60 KB/s我会将运行时间设置为10秒,以便每个平均至少获得9个包。 如果您正在为各种连接编写它,我建议您使解决方案动态化,即如果速度很高,您可以轻松地减少平均间隔,但在连接速度较慢的情况下,您必须增加平均间隔。

要么通过移动平均值建议@pst,要么只是将睡眠时间增加到1秒。

并且一定要除以实际花费的时间而不是传递给Thread.Sleep()的时间。

间隔的额外想法

我的过程将是这样的,测量5秒并收集数据,即收到的字节数和数据包数。

 var timePerPacket = 5000 / nrOfPackets; // Time per package in ms var intervalTime = Math.Max(d, Math.Pow(2,(Math.Log10(timePerPacket)))*100); 

这将导致间隔从大约几十毫秒缓慢增加到每个数据包的时间。 这样我们每个时间间隔至少(平均)一个包,如果我们使用10 Gbps连接,我们就不会疯狂。 重要的是测量时间不应与收到的数据量成线性关系。

以下是LINQPad的快速代码片段。 它使用非常简单的移动平均线。 它使用“Speedtest.net”显示“准确的速度”。 需要记住的是Kbps是以单位的,并且HTTP数据经常被压缩,因此对于高度可压缩的数据,“下载的字节”将显着更小。 另外,不要忘记现在任何旧流程都可能在互联网上做任何旧事(没有更严格的防火墙设置)。

我喜欢弗林登堡的答案(不要改变接受),我注意到一些民意调查时期将返回“0”,与他/她的结论一致。

使用你自己的危险。

 void Main() { var nics = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(); // Select desired NIC var nic = nics.Single(n => n.Name == "Local Area Connection"); var reads = Enumerable.Empty(); var sw = new Stopwatch(); var lastBr = nic.GetIPv4Statistics().BytesReceived; for (var i = 0; i < 1000; i++) { sw.Restart(); Thread.Sleep(100); var elapsed = sw.Elapsed.TotalSeconds; var br = nic.GetIPv4Statistics().BytesReceived; var local = (br - lastBr) / elapsed; lastBr = br; // Keep last 20, ~2 seconds reads = new [] { local }.Concat(reads).Take(20); if (i % 10 == 0) { // ~1 second var bSec = reads.Sum() / reads.Count(); var kbs = (bSec * 8) / 1024; Console.WriteLine("Kb/s ~ " + kbs); } } } 

请试试这个。 检查互联网连接速度。

  public double CheckInternetSpeed() { // Create Object Of WebClient System.Net.WebClient wc = new System.Net.WebClient(); //DateTime Variable To Store Download Start Time. DateTime dt1 = DateTime.Now; //Number Of Bytes Downloaded Are Stored In 'data' byte[] data = wc.DownloadData("http://google.com"); //DateTime Variable To Store Download End Time. DateTime dt2 = DateTime.Now; //To Calculate Speed in Kb Divide Value Of data by 1024 And Then by End Time Subtract Start Time To Know Download Per Second. return Math.Round((data.Length / 1024) / (dt2 - dt1).TotalSeconds, 2); } 

它以Kb /秒为单位提供速度并分享结果。