У меня есть система FreeBSD 11, в которой я получаю следующий вывод для ifconfig
команда
# ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet 127.0.0.1 netmask 0xff000000
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
groups: lo
xn0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=503<RXCSUM,TXCSUM,TSO4,LRO>
ether 0e:c2:a2:36:c1:b4
inet 10.0.0.71 netmask 0xffffff00 broadcast 10.0.0.255
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
media: Ethernet manual
status: active
Здесь два сомнения:
.conf
файла) вместо того, чтобы менять мой метод мониторинга (например, анализ ответа от iftop
или какая-то другая команда)Заранее спасибо !
редактировать В частности, библиотека C используется в этом двоичном файле для получения статистики, которая оказывается равной нулю. Я прилагаю образец кода, который также возвращает нулевые значения для байтов rx / tx, потому что эта информация недоступна. Оно использует getifaddrs
функция от sys/sockets
библиотека
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
struct if_data {
unsigned char ifi_type;
unsigned char ifi_physical;
unsigned char ifi_addrlen;
unsigned char ifi_hdrlen;
unsigned char ifi_recvquota;
unsigned char ifi_xmitquota;
unsigned long ifi_mtu;
unsigned long ifi_metric;
unsigned long ifi_baudrate;
unsigned long ifi_ipackets;
unsigned long ifi_ierrors;
unsigned long ifi_opackets;
unsigned long ifi_oerrors;
unsigned long ifi_collisions;
unsigned long ifi_ibytes;
unsigned long ifi_obytes;
unsigned long ifi_imcasts;
unsigned long ifi_omcasts;
unsigned long ifi_iqdrops;
unsigned long ifi_noproto;
unsigned long ifi_recvtiming;
unsigned long ifi_xmittiming;
struct timeval ifi_lastchange;
};
int main()
{
struct ifaddrs *ifap, *ifa;
struct if_data *ifadata = NULL;
char *dev_name;
if (getifaddrs(&ifap) < 0) {
printf ("returning for null");
return 1;
}
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
if (ifa->ifa_flags & 0x01) {
if ( ifa->ifa_addr->sa_family == AF_LINK) {
if (ifa->ifa_data) {
ifadata = (struct if_data *)ifa->ifa_data;
dev_name = ifa->ifa_name;
if (ifadata->ifi_ipackets == 0 && ifadata->ifi_opackets == 0)
{
printf("returning as zero for %s", dev_name);
continue;
}
printf("name=%s ipkts=%ld opkts=%ld\n", dev_name,
ifadata->ifi_ipackets, ifadata->ifi_opackets);
printf("%lu", ifadata->ifi_ibytes);
printf("%lu", ifadata->ifi_ipackets);
printf("%lu", ifadata->ifi_ierrors);
printf("%lu", ifadata->ifi_iqdrops);
printf("%lu", ifadata->ifi_imcasts);
printf("%lu", ifadata->ifi_obytes);
printf("%lu", ifadata->ifi_opackets);
printf("%lu", ifadata->ifi_oerrors);
}
}
}
}
freeifaddrs(ifap);
return 0;
}
Чтобы ответить на ваш вопрос, я должен сказать, что, насколько я помню, FreeBSD - а также macOS - никогда не отображались Пакеты RX / TX как результат ifconfig
команда. Но если вы говорите, что это было доступно в 7.x и 8.x, я должен сказать, по крайней мере, в 10 и 11, это не так, может быть, я не заметил того времени для 7.x 8.x. Действительно, дистрибутивы Linux, включая производные RHEL (RHEL, Fedora, CentOS, Scientific и т. Д.), Операционные системы на основе Debian (Ubuntu, Debian Jessie и т. Д.) И большинство других дистрибутивов показывают пакеты RX / TX через ifconfig
, Но FreeBSD и macOS этого не делают. Многие команды FreeBSD не имеют ничего общего с командами в Linux, многие из них просто вызываются одинаково, но на самом деле во многих случаях действуют по-разному. А пока ваш struct if_data
не кажется мне знакомым - и правильным - я рекомендую вам взглянуть на <net/if.h>
. Другими словами, удалите свой if_data
и постарайтесь включить точный заголовок.
В любом случае, чтобы отобразить количество байтов ввода / вывода во FreeBSD, вы должны использовать netstat
. Следующая команда отлично работает как во FreeBSD, так и в macOS:
netstat -idb [interface]
-i : interface
-d : show the number of dropped packets
-b : show the number of packets in and out
Вы также можете использовать -B, если вам это нужно. Он показывает статистику о партнере bpf (). Это включает в себя такую информацию, как количество пакетов, сопоставленных, отброшенных и полученных устройством bpf, а также информацию о текущем размере буфера и статистике устройства.
Кстати, для мониторинга сетевого трафика у вас есть еще один вариант, который я настоятельно рекомендую. Ты можешь использовать systat
с -ifstat
возможность получить пропускную способность, пиковую и общую пропускную способность ваших интерфейсов:
systat -ifstat