2009-08-26 2 views
3

Я нахожусь в ситуации, когда я ограничен ограниченной пропускной способностью и должен уделять большую часть полосы пропускания передаче одного типа данных измерений. Иногда я буду рассылать много данных измерений, а в других случаях я просто буду ждать событий (все это по TCP-сокету).Мониторинг использования сетевого интерфейса Linux в C/C++

Я хотел бы иметь возможность передавать полный файл данных (отличных от измерений) в фоновом режиме со скоростью, которая обратно пропорциональна количеству измерений, которые я отправляю обратно.

Я ищу способ отслеживать, сколько байтов отправляется через сетевой интерфейс, во многом аналогично системному монитору на Ubuntu. Исходный код для системного монитора зависит от библиотек gnome, и поскольку моя программа находится на встроенном устройстве, я хотел бы уменьшить количество внешних библиотек, которые я использую. Кто-нибудь знает способ сделать это на C/C++ без большого количества дополнительных библиотек в стандартном дистрибутиве Linux?

ответ

3

Один из самых простых способов является разбор файла:/Proc/нетто/DEV

Mine содержит:

Inter-| Receive            | Transmit 
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed 
    lo: 44865 1431 0 0 0  0   0   0 44865 1431 0 0 0  0  0   0 
    eth0:150117850 313734 0 0 0  0   0   0 34347178 271210 0 0 0  0  0   0 
    pan0:  0  0 0 0 0  0   0   0  0  0 0 0 0  0  0   0 

Вы могли бы написать парсер, который не использует ничего, кроме C/C++ библиотеки.

1

Использование NetLink гнезда гнездо разъема RTNetLink, они получат Вам требуется в формате Struct net_device_stats

+0

Есть ли у вас хорошие примеры? Все учебные пособия, которые я мог найти в Интернете, были не слишком полезны ... –

1

байт передается и получил через , доступную /sys/class/net/eth0/statistics/tx_bytes и /sys/class/net/eth0/statistics/rx_bytes файлов.

$ cat /sys/class/net/net1/statistics/rx_bytes 
1055448