Linux用/proc/net/dev第9列读网卡出口字节数,需两次采样求差并过滤lo;Windows需GetIfEntry2()获取OutOctets,无线速率须fallback处理。

Linux下用/proc/net/dev读取网卡出口字节数最直接
Windows没有等价的轻量级内核接口,Linux上/proc/net/dev是唯一无需特权、不依赖第三方库就能拿到每秒出口字节的途径。文件里每行对应一个网卡,第9列(空格分隔)是发送字节数,需两次采样做差再除以时间间隔。
- 注意字段顺序:不同内核版本列数可能微调,务必用
awk '{print $1,$9}' /proc/net/dev确认第9列确实是tx_bytes - 避开回环接口:
lo的tx_bytes会持续增长,应过滤掉,只监控eth0、wlan0等物理/无线接口 - 采样间隔别太短:小于100ms会导致浮点误差放大,建议固定用
std::this_thread::sleep_for(1s)做1秒间隔
C++里用std::ifstream逐行解析/proc/net/dev要跳过前两行
/proc/net/dev开头两行是表头和分隔线,直接getline()两次再开始处理,否则会把字符串当数字解析失败。每行格式类似 eth0: 123456789 0 0 0 0 0 0 0 987654321 0 0 0 0 0 0 0,冒号后有空格,需用substr()或find_first_of(':')提取接口名。
- 接口名提取示例:
auto pos = line.find(':'); std::string iface = line.substr(0, pos);,记得trim()前后空格 - 字节数转
uint64_t:用std::stoull(token)而非atoi(),避免32位溢出(GB级流量1秒就超2^32) - 别用
std::stringstream按空格split:字段间可能有多个空格,std::istringstream会跳过连续空格但易错位,推荐std::regex_token_iterator或手写空格跳过逻辑
计算带宽利用率得知道网卡理论最大速率
出口带宽利用率 = (当前出口bps ÷ 网卡标称速率) × 100%,但C++无法直接从/proc/net/dev读到速率,得查/sys/class/net/<iface>/speed</iface>。这个文件只对有线网卡存在,无线网卡会报No such device,必须做fallback处理。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 有线场景:
std::ifstream("/sys/class/net/eth0/speed") >> speed_mbps;,单位是Mbps,需转为bps(×1000000) - 无线场景:
/sys/class/net/wlan0/phy80211/name可确认是WiFi,此时只能估算——比如按常见AC协议最大867Mbps或AX协议2400Mbps硬编码,或留空显示“N/A” - 注意权限:
/sys/class/net/*/speed某些发行版需root,若读失败应降级为仅显示绝对值趋势图,不计算百分比
Windows上没/proc就得调GetIfEntry2()加轮询
Windows必须用iphlpapi.h里的GetIfEntry2(),它返回MIB_IF_ROW2结构体,其中OutOctets字段才是出口字节。但该API在Windows 7+才支持,且每次调用有毫秒级开销,不能高频调用。
立即学习“C++免费学习笔记(深入)”;
- 初始化要
InitializeUnicastIpAddressEntry()?不用,GetIfEntry2()本身已足够,但需先ConvertStringSidToSid()?也不用,纯C++项目只需链接iphlpapi.lib - 接口筛选靠
InterfaceLuid匹配,不是名字字符串——wlan0在Windows叫{guid},得用GetIfTable2()遍历所有接口再比对Alias字段 - 获取速率得查
TransmitLinkSpeed成员,但WiFi接口常返回0,此时只能用GetIfEntry2()返回的AccessType判断是否为IF_ACCESS_WIRELESS,再手动设默认值
跨平台代码里最容易漏的是无线网卡速率 fallback 和 proc 文件字段偏移校验,这两处不处理,图表数值就会突然归零或爆表。

















