我想通過使用C#.NET的網絡接口獲得準確的下載/上傳速度。我知道可以使用GetIPv4Statistics().BytesReceived
計算它並將線程休眠一段時間。但它沒有給出我在瀏覽器中獲得的輸出結果。如何在C#.NET中獲得準確的下載/上傳速度?
回答
通過查看您在NetworkInterface.GetIPv4Statistics().BytesReceived - What does it return?中發佈的問題的另一個答案,我認爲問題可能是您正在使用較小的間隔。我認爲該計數器只計算整個軟件包,如果您例如正在下載文件,軟件包可能會大到64 KB
(65,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連接,我們不會發瘋。重要的部分是測量時間不應與接收到的數據量成線性關係。
謝謝。如果我增加間隔,它會使輸出幾乎正確。但是我也必須計算其他NetworkInterfaces的速度。因此,更新一個特定網絡接口的速度值將會太慢。所以,我認爲我應該去@ pst的實施。你怎麼看? –
@ soham.m17我也建議。並且看到我的上一次編輯,由於吞吐量和最大IPv4封裝大小之間的比率,更短的「時間量」是必要的。總是要確保平均至少有幾個包:) – flindeberg
似乎不太可能使用ip包> 15xx字節。很少有互聯網連接支持更大的MTU。 – CodesInChaos
以下是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);
}
}
}
謝謝。但我沒有得到'if(i%10 == 0){//〜1秒'部分。你每1秒顯示一次輸出。是這樣嗎? –
@ soham.m17是的。閱讀比每秒十分之一更容易閱讀。或者,只需每秒調查一次,然後將SMA調整爲N(4可能?)秒。 – 2012-11-28 09:16:00
SMA是什麼意思? –
請試試這個。檢查互聯網連接速度。
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 /秒的速度並分享結果。
你可以試試這個。 https://www.nuget.org/packages/InetSpeedWinRT/ –
- 1. 獲取下載和上傳速度C#
- 2. 用C#下載/上傳進度和速度的最有效/準確的方法?
- 3. 如何在iOS上獲得最準確的用戶速度
- 4. python獲取上傳/下載速度
- 5. iPhone CoreLocation:如何獲得最準確的速度
- 6. Java:如何獲取上傳和下載速度
- 7. Android如何獲得無線下載和每分鐘上傳速度?
- 8. Android:如何獲得準確的高度?
- 9. 如何獲得準確的深度圖?
- 10. 如何在Android中獲取GPS中最準確的速度
- 11. 如何使用位置管理器獲得準確速度
- 12. Mesaure上傳和下載iPhone的速度
- 13. 非常慢的上傳/下載速度
- 14. 如何獲得無線傳輸速度?
- 15. 如何使用.NET創建下載速度測試(C#)
- 16. 降低上傳/下載速度
- 17. cURL上傳/下載速度測試
- 18. 計算下載/上傳速度
- 19. 以編程方式確定iPhone上傳/下載速度
- 20. 網頁速度測試:如何獲得理論加載速度
- 21. 如何獲得從服務器使用下載文件的速度目標C
- 22. 如何獲得當前帶寬(下載)速度?
- 23. 如何在Android中獲得Interent速度?
- 24. 快速獲得每1%準確度後的電量水平
- 25. 在curl和C++中測量下載速度。我做得對嗎?
- 26. 獲得準確的精度數十進制c後的精度#
- 27. 如何在Keras中獲得訓練準確度輸出?
- 28. 如何衡量在android下的數據下載和上傳速度?
- 29. 如何獲得Ram速度?
- 30. 如何使用Apache FTPClient測量上傳/下載速度
它有多大的區別?還有什麼其他網絡流量? – 2012-11-28 08:19:32
我在應用程序中看不到恆定的速度,而我的瀏覽器顯示恆定速度。我的應用程序非常波動。 –
吞吐量是如何計算的?我預計它不會波動很多。這樣做可能表明移動平均線計算錯誤。 – 2012-11-28 08:24:59