C++如何获取操作系统的实时网络收发字节速率明细动态趋势

秋雪君_4872

秋雪君_4872

2026-07-18

579人浏览

原创

linux用/proc/net/dev需跳过前两行、用stoull解析rx_bytes(第2列)和tx_bytes(第10列),windows用getifentry2配合interfaceluid获取bytesreceived/sent,跨平台须统一steady_clock计时并滤除异常差值。

c++如何获取操作系统的实时网络收发字节速率明细动态趋势

Linux下用/proc/net/dev解析网卡实时字节速率

直接读取 /proc/net/dev 是最轻量、无依赖的方式,它每秒更新一次内核统计,适合做秒级采样。关键不是“怎么读文件”,而是“怎么算差值才准”——必须跳过前两行头信息,且同一网卡的接收(rx_bytes)和发送(tx_bytes)字段位置固定但因对齐可能有空格干扰。

实操建议:

  • 用 std::ifstream 逐行读,用 std::istringstream 按空白分割,跳过空行和前两行;第1列是接口名(如 eth0),第2列是接收字节数,第10列是发送字节数(Linux 5.10+ 标准格式)
  • 两次读取间隔至少 1 秒,否则差值为 0 或负数(计数器未更新)
  • 注意:虚拟网卡(如 docker0、veth*)也会出现在该文件里,需按需过滤
  • 别用 std::stoi 解析字节数——可能超 int 范围,改用 std::stoull

Windows上用GetIfEntry2获取每秒收发速率

Windows 没有类似 /proc 的伪文件系统,得靠 iphlpapi.h 提供的 GetIfEntry2。它返回的是自启动以来的累计字节数,所以仍需两次调用取差值。但坑在于:接口索引(Luid)比名称更可靠,因为名称可能含空格或本地化字符(如“以太网”),而 Luid 是唯一稳定标识。

实操建议:

  • 先调 GetIfTable2 获取所有接口列表,遍历找目标网卡的 InterfaceLuid
  • 再用该 Luid 调 GetIfEntry2,读取 BytesReceived 和 BytesSent 字段(类型为 ULONGLONG)
  • 两次调用间隔建议 ≥ 1000ms,但 Windows 计数器更新频率实际约 1–2 秒,太快反而返回相同值
  • 注意权限:普通用户可读,但若进程被 UAC 虚拟化(如路径含 Program Files),可能读不到某些接口——建议用绝对路径启动或放桌面测试

跨平台封装时如何避免时间戳漂移误差

速率 = (bytes2 − bytes1) / (time2 − time1),看着简单,但 std::chrono::steady_clock 和 system_clock 混用会导致分母为 0 或负数。尤其在 Windows 上,GetTickCount64() 和 steady_clock 不同源,不能混算。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

  • 统一用 std::chrono::steady_clock::now() 获取时间点,它不随系统时间调整而跳变
  • 存储上次采样时间与字节数时,用 std::pair<:chrono::steady_clock::time_point uint64_t></:chrono::steady_clock::time_point> 结构,避免分别存两个变量导致错位
  • 首次采样时跳过速率计算(没历史值),第二次起才输出有效速率
  • 如果用 sleep 控制采样间隔,别用 std::this_thread::sleep_for 精确等待——系统调度延迟会让实际间隔浮动 ±10ms,应以“采样时刻”为准动态计算差值

绘图或打点前务必处理瞬时尖刺

网络字节计数器本身是单调递增的,但偶尔会出现异常回绕(尤其是32位驱动或旧设备)或内核统计抖动,导致单次差值极大(例如从 10GB 突然跳到 1KB)。不做滤波,图表会炸出几百 MB/s 的假峰值。

实操建议:

  • 设置合理上限阈值:千兆网卡理论峰值约 125MB/s,万兆约 1250MB/s,超过 2 倍就视为异常,丢弃该次差值
  • 用滑动窗口中位数(3–5 个点)代替原始值,比均值更能抵抗单点毛刺
  • 若连续两次差值为 0,说明网卡空闲,但不要直接画 0——保持上一个非零值或插值,避免图表锯齿
  • 日志打点时,建议同时记录原始累计值和计算后速率,方便事后回溯是否为采集逻辑错误

真正难的不是读数据,是让两次读之间的差值有意义——时间不准、计数器溢出、接口名歧义、内核更新延迟,每个环节都可能让“速率”变成噪声。动手前先确认你采的是哪个接口、单位是字节还是包、要不要排除 loopback 流量,这些比代码本身更影响结果可信度。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

操作系统 字节 c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

ubuntu官方总文档
ubuntu官方总文档

共0课时 | 0人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 20.6万人学习