应直接读取/proc/net/dev文件获取实时收发包数:第二列为接收包总数,第十列为发送包总数;用awk提取指定接口数据,C++持续监控需两次快照相减并处理溢出;可选netlink监听接口状态变更。

要获取Linux系统中网络接口的实时进出流量包计数(如接收/发送的总数据包数),必须绕过用户态工具(如iftop、nethogs)的采样层,直接读取内核暴露的procfs接口,避免统计延迟和精度损失。
读取/proc/net/dev获取原始包计数
打开终端,执行:cat /proc/net/dev。该文件每行代表一个网络接口,第二列是接收包总数(rx_packets),第三列是接收错误包数,第十列是发送包总数(tx_packets),第十一列是发送错误包数。
注意:第一行是标题行,第二行是“lo”回环接口,真实物理接口(如ens33、eth0)从第三行起;字段以空白符分隔,但列宽不固定,【必须用awk或正则跳过前两列的空格对齐问题】。
快速提取ens33的收发包数:`awk '/ens33/ {print "RX:", $2, "TX:", $10}' /proc/net/dev`。
立即学习“C++免费学习笔记(深入)”;
用C++持续监控并计算差值
第一步:包含必要头文件:#include <fstream>、#include <string>、#include <unordered_map>、#include <chrono>、#include <thread>。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
第二步:定义函数std::unordered_map<std::string, std::pair<unsigned long, unsigned long>> readDev(),逐行读取/proc/net/dev,跳过前两行,对每行用std::istringstream分割字符串,取第1个有效非空字段为接口名,第2个为rx_packets,第10个为tx_packets;【若某行字段不足10个,直接跳过,避免std::stoul崩溃】。
第三步:在主循环中,调用两次readDev(),间隔1秒,用std::this_thread::sleep_for(std::chrono::seconds(1))控制;对同一接口,用新rx减旧rx得每秒接收包数,新tx减旧tx得每秒发送包数。
这一步操作起来很简单,直接把两次快照相减就行,但要注意溢出——内核计数器是unsigned long,若接口重启过,新值可能小于旧值,此时应按0处理差值。
通过netlink套接字监听接口状态变更(可选增强)
方法一:使用NETLINK_ROUTE协议创建socket,绑定到RTMGRP_LINK组播组,接收RTM_NEWLINK/RTM_DELLINK消息,实时感知接口上下线。
方法二:不解析完整netlink消息头,只检查nlmsg_type是否为RTM_NEWLINK,再用if_indextoname()将消息中的index转为接口名,触发重新初始化该接口的计数快照。
注意:netlink socket需root权限,且必须设置SO_RCVBUF足够大(至少8192),否则丢包导致状态不同步。

















