11

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

4

3 回答 3

11

这是来自 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<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);
        }
    }
}
于 2012-11-28T09:05:15.583 回答
10

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

 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/Sec 的速度并分享结果。

于 2015-03-19T18:45:47.743 回答
4

通过查看您在NetworkInterface.GetIPv4Statistics().BytesReceived 中发布的问题的另一个答案 - 它返回什么?我相信问题可能是您使用的间隔很小。我相信计数器只计算整个包,例如,如果您正在下载一个文件,则包可能会变得像64 KB( , IPv4 max package size) 一样大,如果您的最大下载吞吐量是并且您正在测量间隔,那么65,535 bytes这是相当多的。60 KB/s200 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 连接,我们不会发疯。重要的是测量时间不应与接收的数据量成线性关系。

于 2012-11-28T08:54:12.540 回答