2011-01-09 4 views
2

Ich möchte die aktuelle Download-Geschwindigkeit messen. Ich sende riesige Datei über TCP. Wie kann ich die Übertragungsrate jede Sekunde erfassen? Wenn ich IPv4InterfaceStatistics oder eine ähnliche Methode verwende, erfasse ich die Übertragungsrate des Geräts, anstatt die Übertragungsgeschwindigkeit der Datei zu erfassen. Das Problem bei der Erfassung der Geräteübertragungsrate besteht darin, dass alle laufenden Daten über das Netzwerkgerät erfasst werden und nicht die einzelne Datei, die ich übertrage.Messen Sie die Datenübertragungsrate über TCP mit C#

Wie kann ich die Dateiübertragungsrate erfassen? Ich benutze C#.

+1

Bei dem Verfahren, das die Daten empfängt, jede Sekunde überprüfen, wie viele Daten Sie haben und dividieren durch die Zeit, die hat bestanden. Oder habe ich hier Schwierigkeiten übersehen? –

+0

gut, wie kann ich jede Sekunde überprüfen, wie viele Daten ich in C# erfolgreich erhalten habe? Vielleicht vermisse ich etwas. Ich kann keine verwandte Methode im Netzwerk finden. Vielen Dank. –

Antwort

1

Da Sie keine Kontrolle über Strom haben, ihm zu sagen, wie viel lesen, können Sie Zeit-Stempel vor und nach einem Stream gelesen und dann basierend auf empfangenen oder gesendeten Bytes berechnen die Geschwindigkeit:

using System.IO; 
using System.Net; 
using System.Diagnostics; 

// some code here... 

StopWatch stopWatch = new stopWatch(); 

// Begining of the loop 

int offset = 0; 
stopWatch.Reset(); 
stopWatch.Start(); 

bytes[] buffer = new bytes[1024]; // 1 KB buffer 
int actualReadBytes = myStream.Read(buffer, offset, buffer.Length); 

// Now we have read 'actualReadBytes' bytes 
// in 'stopWath.ElapsedMilliseconds' milliseconds. 

stopWatch.Stop(); 
offset += actualReadBytes; 
int speed = (actualReadBytes * 8)/stopWatch.ElapsedMilliseconds; // kbps 

// End of the loop 

Sie sollten die Stream.Read in eine try/catch setzen und Lese Ausnahme behandeln. Es ist das gleiche für zu Ströme zu schreiben und die Geschwindigkeit zu berechnen, nur diese beiden Linien betroffen sind:

myStream.Write(buffer, 0, buffer.Length); 
int speed = (buffer.Length * 8)/stopWatch.ElapsedMilliseconds; // kbps 
+0

genau das habe ich getan. Das Problem bei dieser Methode ist, dass die Ergebnisse immer sehr viel niedriger als tatsächlich sind. Wenn ich z. B. Daten sende, beobachte ich die Gerätedatenübertragung mithilfe von Tools, die IPv4InterfaceStatistics verwenden. Damit kann ich die tatsächliche Übertragungsrate des Geräts sehen. Wenn ich den Durchschnitt der Übertragungsrate finde, sind die Ergebnisse immer niedriger als IPv4InterfaceStatistics. mein Interesse ist, die maximale Datenübertragung, nicht durchschnittlich. Vielen Dank. –

+2

Dies sind die echten wertvollen Daten, die Sie gesendet oder empfangen haben. Andere Layer fügen Ihren Daten basierend auf dem verwendeten Protokoll Kopf- und/oder Fußzeilen hinzu. Wenn Sie zum Beispiel 'SSL' verwenden, dann sind die übertragenen Daten des Geräts viel mehr als' actualBytes'. Dazu wird auch 'OS'-Datentransfer hinzugefügt (für' DNS'-Abfragen ...). Nur so können Sie die Kontrolle über die Datenübertragung übernehmen. Sie können die Überlast für Ihren Fall schätzen und diese Geschwindigkeit mit diesem Verhältnis multiplizieren, um eine höhere Geschwindigkeit, aber nicht die genaue Geschwindigkeit zu erreichen. – Xaqron

+0

Ich vermisse vielleicht etwas, aber wenn du es mal mit 8 multiplizierst du nicht die Kilobits (Kb/sec) und nicht die Kilobyte (KB/Sek)? – Fidel