Мониторинг использования сетевого интерфейса Linux в C / C ++ - PullRequest
3 голосов
/ 26 августа 2009

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

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

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

Ответы [ 3 ]

3 голосов
/ 26 августа 2009

Один из самых простых способов - разобрать файл: / proc / net / dev

Шахта содержит:

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 голос
/ 07 мая 2016

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

$ cat /sys/class/net/net1/statistics/rx_bytes 
1055448
1 голос
/ 26 августа 2009

Используйте сокеты NetLink интерфейсного сокета RTNetLink, они получат необходимые данные в формате struct net_device_stats

...