Comment obtenir une vitesse de téléchargement / téléchargement précise en C # .NET?

Je souhaite obtenir une vitesse de téléchargement / téléchargement précise via une interface réseau à l’aide de C # .NET. Je sais qu’elle peut être calculée à l’aide de GetIPv4Statistics().BytesReceived et la mise en veille du thread pendant un GetIPv4Statistics().BytesReceived temps. Mais cela ne donne pas à la sortie ce que je reçois dans mon navigateur.

En examinant une autre réponse à une question que vous avez posée dans NetworkInterface.GetIPv4Statistics (). BytesReceived – Que renvoie-t-il? Je crois que le problème peut être que vous utilisez à de petits intervalles. Je crois que le compteur ne compte que les paquets entiers. Par exemple, si vous téléchargez un fichier, il peut atteindre 64 KB ( 65,535 bytes , taille de paquet IPv4 max), ce qui est assez si votre débit de téléchargement maximal est de 60 KB/s et vous 200 ms intervalles de 200 ms .

Étant donné que votre vitesse est de 60 KB/s j’aurais réglé le temps d’exécution à 10 secondes pour obtenir au moins 9 colis par moyenne. Si vous l’écrivez pour toutes sortes de connexions, je vous conseillerais de rendre la solution dynamic. En d’autres termes, si la vitesse est élevée, vous pouvez facilement réduire l’intervalle de moyenne, mais dans le cas de connexions lentes, vous devez augmenter l’intervalle de moyenne.

Faites ce que @pst recommande en ayant une moyenne mobile ou augmentez simplement le sumil jusqu’à peut-être 1 seconde.

Et assurez-vous de diviser par le temps réel pris plutôt que par le temps passé à Thread.Sleep() .

Pensée supplémentaire sur les intervalles

Mon processus ressemblerait à ceci: mesurer pendant 5 secondes et collecter des données, c’est-à-dire des octets reçus ainsi que le nombre de paquets.

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

Cela entraînera une augmentation lente de l’intervalle d’environ plusieurs dizaines de ms jusqu’au temps par paquet. De cette façon, nous obtenons toujours au moins (en moyenne) un paquet par intervalle et nous ne serons pas fous si nous sums sur une connexion à 10 Gbps. L’important est que le temps de mesure ne soit pas linéaire par rapport à la quantité de données reçues.

Voici un extrait de code de LINQPad. Il utilise une moyenne mobile très simple. Il montre “des vitesses précises” en utilisant “Speedtest.net”. Il faut garder à l’esprit que Kbps est en bits et que les données HTTP sont souvent compressées, ainsi les “octets téléchargés” seront nettement plus petits pour les données hautement compressibles. N’oubliez pas non plus que tout processus ancien peut faire n’importe quoi sur Internet ces derniers temps (sans configuration de pare-feu plus ssortingcte).

J’aime la réponse de flindenberg (ne modifiez pas l’acceptation) et j’ai remarqué que certaines périodes de scrutin renverraient “0”, ce qui correspond à ses conclusions.

Utilisez à vos risques et périls.

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

S’il vous plaît essayez ceci. Pour vérifier la vitesse de connexion Internet.

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

Il vous donne la vitesse en Kb / Sec et partage le résultat.