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/秒で速度を示し、結果を共有します。

于 2015-03-19T18:45:47.743 に答える
4

NetworkInterface.GetIPv4Statistics()。BytesReceivedに投稿した質問に対する別の回答を見ると、何が返されますか?問題は、あなたが少しの間隔で使用していることかもしれないと思います。カウンターはパッケージ全体のみをカウントすると思います。たとえば、ファイルをダウンロードする場合、パッケージは64 KB( 、IPv4の最大パッケージサイズ)と同じくらい大きくなる可能性があります。これは、最大ダウンロードスループットがで、間隔を測定して65,535 bytesいる場合はかなり大きくなります。60 KB/s200 ms

あなたの速度を考えると、60 KB/s平均で少なくとも9つのパッケージを取得するには、実行時間を10秒に設定します。すべての種類の接続用に作成する場合は、ソリューションを動的にすることをお勧めします。つまり、速度が速い場合は平均化間隔を簡単に短くできますが、接続が遅い場合は平均化間隔を長くする必要があります。

@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);

これにより、間隔は約数十ミリ秒からパケットあたりの時間までゆっくりと増加します。そうすれば、間隔ごとに少なくとも(平均して)1つのパッケージを常に取得でき、10Gbps接続を使用している場合は問題が発生しません。重要な部分は、測定時間が受信したデータの量に対して線形であってはならないということです。

于 2012-11-28T08:54:12.540 に答える