Как рассчитать использование сети для передачи и приема - PullRequest
2 голосов
/ 06 октября 2009

Как рассчитать использование сети для передачи и получения, используя C или сценарий оболочки?

Моя система - встроенный Linux. Мой текущий метод состоит в том, чтобы записать полученные байты (b1), подождать 1 секунду, а затем записать снова (b2). Затем, зная скорость соединения, я вычисляю процент использованной пропускной способности.

использование получения = (((b2 - b1) * 8) / скорость_ссылки) * 100

есть лучший метод?

Ответы [ 2 ]

3 голосов
/ 06 октября 2009

Проверьте программы с открытым исходным кодом, которые делают что-то подобное.

Мой поиск обнаружил небольшой инструмент под названием vnstat .

Он пытается запросить файловую систему / proc, если она доступна, и использует getifaddrs для систем, в которых ее нет. Затем он выбирает правильный интерфейс AF_LINK, выбирает соответствующую структуру if_data и затем считывает переданные и полученные байты, например:

ifinfo.rx = ifd->ifi_ibytes;
ifinfo.tx = ifd->ifi_obytes;

Также помните, что sleep () может спать дольше ровно 1 секунды, поэтому вам, вероятно, следует использовать таймер с высоким разрешением (настенные часы) в своем уравнении - или вы можете углубиться в функции и структуры if, чтобы посмотреть найдите что-нибудь подходящее для вашей задачи.

0 голосов
/ 08 октября 2009

спасибо 'csl' за указание в направлении vnstat. используя пример vnstat, вот как я рассчитываю использование сети.

#define FP32 4294967295ULL
#define FP64 18446744073709551615ULL
#define COUNTERCALC(a,b) ( b>a ? b-a : ( a > FP32 ? FP64-a-b : FP32-a-b))
int sample_time = 2; /* seconds */
int link_speed = 100; /* Mbits/s */
uint64_t rx, rx1, rx2;
float rate;

/* 
 * Either read:
 * '/proc/net/dev' 
 * or 
 * '/sys/class/net/%s/statistics/rx_bytes'
 * for bytes received counter
 */

rx1 = read_bytes_received("eth0"); 
sleep(sample_time); /* wait */
rx2 = read_bytes_received("eth0");

/* calculate MB/s first the convert to Mbits/s*/
rx = rintf(COUNTERCALC(rx1, rx2)/(float)1048576);
rate = (rx*8)/(float)sample_time;

percent = (rate/(float)link_speed)*100;
...