在 Linux 上,我如何(以编程方式)基于每个接口检索以下计数器:
- 发送/接收以太网帧,
- 发送/接收 IPv4 数据包,
- 发送/接收 IPv6 数据包。
在 Linux 上,我如何(以编程方式)基于每个接口检索以下计数器:
在我的系统上,有一些文件/sys/class/net/eth0/statistics
,其中提供了有关网络接口的各种统计信息。
这是假设最近/sys
安装了(sysfs)的Linux。
cat /proc/net/dev
应包含计数器、统计数据和信息。
您应该能够使用iptables
规则和数据包计数器来执行此操作,例如
# input and output must be accounted for separately
# ipv4, eth0
iptables -I INPUT -i eth0
iptables -I OUTPUT -o eth0
# ipv6, eth0
ip6tables -I INPUT -i eth0
ip6tables -I OUTPUT -o eth0
要查看统计信息,请解析这些输出:
iptables -L -vxn
ip6tables -L -vxn
-Z
您还应该在要重置计数器时查找标志。
您总是可以自己解析各种内核状态文件,我认为这就是工具喜欢netstat
做的事情。
手册页建议:
/proc/net/raw
-- 原始套接字信息/proc/net/tcp
-- TCP 套接字信息/proc/net/udp
-- UDP套接字信息我想应该有一个非过程的方式来做到这一点,也许/sys
也是?我快速浏览了一下,但什么也没找到。
要么只解析netstat -i
. 或者strace netstat -i
,并使用它来确定它在哪里查找信息。
ifconfig
告诉您传输的数据量(字节和数据包)。
以下命令提供在系统范围内维护的 ipv4/ipv6 统计信息:
netstat --statistics
nstat -z
cat /proc/net/dev_snmp6/eth0 gives ipv6 stats per interface
您可以使用ethtool打印完整的以太网统计信息:
ethtool -S eth1
您可以在 monodevelop 的 C# 中轻松做到这一点:
using System.Net.NetworkInformation;
foreach (NetworkInterface ni in interfaces)
{
// perform your calculations
}