2011-01-09 32 views
2

で測定します。現在のダウンロード速度を測定したいと思います。私はTCP経由で巨大なファイルを送信しています。 1秒ごとに転送速度をキャプチャできますか?私がIPv4InterfaceStatisticsまたは同様の方法を使用する場合、ファイル転送速度をキャプチャする代わりに、私はデバイス転送速度を取得します。デバイスの転送速度をキャプチャする際の問題は、転送する単一のファイルではなく、ネットワークデバイスを介して進行中のすべてのデータをキャプチャすることです。tcpでのデータ転送速度をc#

どのようにファイル転送速度をキャプチャできますか?私はC#を使用しています。

+1

データを受信する方法では、あなたが持っている秒どのくらいのデータのすべてをチェックして、除算あり、時間によって合格。それとも、ここで何か難しかったですか? –

+0

よく、どのくらいのデータをC#で正常に受信したか毎秒確認できますか?多分私は何かが恋しいです。私はネットワークストリームで関連する方法を見つけることができません。ありがとう。 –

答えて

1

あなたはタイムスタンプをすることができますどのくらいの読み取り、ストリーム読み込んで受信または送信されたバイトに基づいて速度を計算する前と後に彼に伝えるために、ストリームを制御できませんので:

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 

Stream.Readtry/catchに置き、読み取り例外を処理する必要があります。これは、ストリームに書き込むために同じだと速度を計算し、ちょうどこの2行が影響を受けます。

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

これはまさに私がやったことです。この方法の問題は、結果が常に実際よりも非常に低いことです。例えば、私がデータを送るとき、私はIPv4InterfaceStatisticsを使うツールを使ってデバイスのデータ転送を見ます。これで、私はデバイスの実際の転送速度を見ることができます。私は転送速度の平均を見つけると、結果は常にそのIPv4InterfaceStatisticsを下げます。私の関心は、平均データ転送ではなく、平均です。ありがとう。 –

+2

これはあなたが送受信した本当の貴重なデータです。他のレイヤーでは、使用プロトコルに基づいてデータにヘッダー/トレーラーが追加されます。たとえば、 'SSL'を使うと、デバイスの転送データは' actualBytes'よりはるかに多くなります。また、これに 'OS'データ転送が追加されます(' DNS'クエリの場合...)。これはデータ転送を制御できる唯一の方法です。ケースの過負荷を見積もり、その速度でこの速度を掛け合わせると、より近い速度が得られますが、正確な速度は得られません。 – Xaqron

+0

私は何かが不足しているかもしれませんが、8倍した場合、kiloBITS(KB /秒)ではなく、kiloBITS(Kb/sec)を計算していませんか? – Fidel

関連する問題