2011-01-09 6 views
2

현재 다운로드 속도를 측정하고 싶습니다. 메신저는 TCP를 통해 거대한 파일을 보냈습니다. 매초마다 전송률을 캡처 할 수 있습니까? 내가 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에 넣고 읽기 예외를 처리해야합니다. 그것은 스트림에 기록 동일합니다 및 속도, 단지이 두 줄이 영향을 계산 :이 시간에 의해 당신이있어 얼마나 많은 데이터를 매초마다 확인, 데이터를 수신하는 방법에있어서

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 배로 계산하면 킬로 바이트 (KB/초)가 아닌 킬로 바이트 (KB/초)가 계산됩니까? – Fidel

관련 문제