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

如何在C#NET中获得准确的下载/上传速度?,c#,.net,network-interface,C#,.net,Network Interface,我想通过使用C#NET的网络接口获得准确的下载/上传速度 我知道可以使用GetIPv4Statistics().BytesReceived并将线程休眠一段时间来计算它。但它并没有给出我在浏览器中得到的输出。通过查看您发布的问题的另一个答案,我相信问题可能是您习惯了很小的间隔。我相信计数器只计算整个软件包,例如,如果您正在下载一个文件,软件包可能会大到64 KB(65535字节,IPv4最大软件包大小),如果您的最大下载吞吐量为60 KB/s,并且您正在测量200 ms的间隔,这将是相当多的 考虑

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

通过查看您发布的问题的另一个答案,我相信问题可能是您习惯了很小的间隔。我相信计数器只计算整个软件包,例如,如果您正在下载一个文件,软件包可能会大到
64 KB
65535字节
,IPv4最大软件包大小),如果您的最大下载吞吐量为
60 KB/s
,并且您正在测量
200 ms
的间隔,这将是相当多的

考虑到你的速度是
60kb/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数据通常是压缩的,因此对于高度可压缩的数据,“下载的字节”将大大减少。另外,不要忘记,现在互联网上任何旧进程都可能在做任何旧事情(没有更严格的防火墙设置)

我喜欢flindenberg的答案(不要改变接受),我注意到一些投票周期会返回与他/她的结论一致的“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<double>();
    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);
        }
    }
}
void Main()
{
var nics=System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
//选择所需NIC
var nic=nics.Single(n=>n.Name==“本地连接”);
var reads=Enumerable.Empty();
var sw=新秒表();
var lastBr=nic.GetIPv4Statistics().BytesReceived;
对于(变量i=0;i<1000;i++){
sw.Restart();
睡眠(100);
var Appead=sw.Appead.TotalSeconds;
var br=nic.GetIPv4Statistics().BytesReceived;
var local=(br-lastBr)/appead;
lastBr=br;
//保持最后20秒~2秒
reads=new[]{local}.Concat(reads).Take(20);
如果(i%10==0){//~1秒
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/秒为单位的速度,并分享结果。

有多大区别?还有什么其他网络流量?我的应用程序中没有看到恒定的速度,而我的浏览器显示的是恒定的速度。我的应用程序波动很大。吞吐量是如何计算的?我希望它不会有太大的波动。这样做可能表明移动平均值的计算不正确。我使用
日期时间开始
,然后记录收到的ByteReceived。然后调用
线程。睡眠(200)
,然后再次计算收到的ByteReceived和
日期时间结束
。现在我将两者都减去,并将接收到的字节数除以从
DateTime
计算出的秒数e、 g.保留最后10个200ms“读数”的值。在LINQ中,
Sum
可以使这相对容易。谢谢。如果我增加间隔,输出几乎是正确的。但我还必须计算其他网络接口的速度。因此,更新一个特定网络接口的速度值太慢。所以,我想我应该支持@pst的实现。你觉得怎么样?@soham.m17我也建议你这样做。请看我的上一次编辑,由于吞吐量和最大IPv4包大小之间的比率,连接越快,需要的“时间量”就越小。始终确保至少对少数包进行平均:)似乎不太可能使用大于15xx字节的ip数据包。很少有互联网连接支持更大的MTU。是的!我一点也没想到那些包裹。很好。所以,我想我应该以200毫秒的间隔保存至少20条最后的记录。我还应该实现一个解决方案,以便在速度高或低时可以更新200ms值。@CodesInChaos您当然是正确的,64KB帧很少使用,但即使是9KB的巨型帧也会严重影响以200ms测量间隔进行的60KB/秒连接。假设他在家里也使用wifi 802.11n,在两次突发之间断电,也会产生同样的效果。我们不能简单地知道,但做最坏的打算总是好的:)谢谢。但是如果(I%10==0){//~1秒部分,我没有得到
。你每1秒显示一次输出。是吗?@soham.m17是的。这比每1/10秒读取一次更容易。或者,只需每秒轮询一次,然后将SMA调整为N(可能是4?)秒..@soham.m17:SMA-简单移动平均线。你应该检查p