2012-11-28 42 views
9

我想通過使用C#.NET的網絡接口獲得準確的下載/上傳速度。我知道可以使用GetIPv4Statistics().BytesReceived計算它並將線程休眠一段時間。但它沒有給出我在瀏覽器中獲得的輸出結果。如何在C#.NET中獲得準確的下載/上傳速度?

+0

它有多大的區別?還有什麼其他網絡流量? – 2012-11-28 08:19:32

+0

我在應用程序中看不到恆定的速度,而我的瀏覽器顯示恆定速度。我的應用程序非常波動。 –

+0

吞吐量是如何計算的?我預計它不會波動很多。這樣做可能表明移動平均線計算錯誤。 – 2012-11-28 08:24:59

回答

4

通過查看您在NetworkInterface.GetIPv4Statistics().BytesReceived - What does it return?中發佈的問題的另一個答案,我認爲問題可能是您正在使用較小的間隔。我認爲該計數器只計算整個軟件包,如果您例如正在下載文件,軟件包可能會大到64 KB65,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連接,我們不會發瘋。重要的部分是測量時間不應與接收到的數據量成線性關係。

+0

謝謝。如果我增加間隔,它會使輸出幾乎正確。但是我也必須計算其他NetworkInterfaces的速度。因此,更新一個特定網絡接口的速度值將會太慢。所以,我認爲我應該去@ pst的實施。你怎麼看? –

+1

@ soham.m17我也建議。並且看到我的上一次編輯,由於吞吐量和最大IPv4封裝大小之間的比率,更短的「時間量」是必要的。總是要確保平均至少有幾個包:) – flindeberg

+0

似乎不太可能使用ip包> 15xx字節。很少有互聯網連接支持更大的MTU。 – CodesInChaos

3

以下是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); 
     } 
    } 
} 
+0

謝謝。但我沒有得到'if(i%10 == 0){//〜1秒'部分。你每1秒顯示一次輸出。是這樣嗎? –

+0

@ soham.m17是的。閱讀比每秒十分之一更容易閱讀。或者,只需每秒調查一次,然後將SMA調整爲N(4可能?)秒。 – 2012-11-28 09:16:00

+0

SMA是什麼意思? –

5

請試試這個。檢查互聯網連接速度。

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 /秒的速度並分享結果。

+0

你可以試試這個。 https://www.nuget.org/packages/InetSpeedWinRT/ –