2011-01-09 3 views
2

Я хочу измерить текущую скорость загрузки. im отправляет огромный файл по tcp. как я могу фиксировать скорость передачи каждую секунду? если я использую IPv4InterfaceStatistics или аналогичный метод, вместо того, чтобы фиксировать скорость передачи файлов, я фиксирую скорость передачи устройства. проблема с передачей скорости передачи устройства заключается в том, что он фиксирует все текущие данные через сетевое устройство, а не один файл, который я передаю.Измерьте скорость передачи данных по tcp с помощью C#

Как я могу захватить скорость передачи файлов? im используя 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.Read в try/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/sec), а не килобайт (КБ/сек)? – Fidel

 Смежные вопросы

  • Нет связанных вопросов^_^