我有一个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文件控制),而不是改变我的监测方法(例如parsing来自iftop或其他命令的响应) 提前致谢 !
编辑具体来说,在该二进制文件中正在使用一个C库,以获得统计数据为零。 我正在附加一个示例代码,它也返回rx / tx字节的零值,因为该信息不可用。 它使用sys/sockets库中的getifaddrs函数
#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中是可用的,我应该至less在10和11中说它不是,也许我没注意到7.x 8.x的时间。 事实上,包括RHEL衍生产品(RHEL,Fedora,CentOS,Scientific等),基于Debian的操作系统(Ubuntu,Debian Jessie等)和大多数其他发行版的Linux发行版通过ifconfig ,FreeBSD和macOS显示了RX / TX包不要这样。 许多FreeBSD的命令与Linux中的命令无关,其中许多命令只是以相同的方式调用,但实际上在许多情况下的行为不同。 与此同时,你的struct if_data对我来说看起来不是很熟悉,而且是正确的,我build议你看看<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()peer的统计信息。 这包括像bpf设备已经匹配,丢弃和接收了多less包等信息,以及有关当前缓冲区大小和设备状态的信息。
顺便说一句,为了监测networkingstream量,你还有另一个我强烈推荐的选项。 您可以使用systat与-ifstat选项来获取您的接口的stream量吞吐量,峰值和总数:
systat -ifstat