c++如何读取并显示系统的路由表信息【实战】

小静同学_6010

小静同学_6010

2026-04-14

395人浏览

原创

Linux下查看路由表最快方式是ip route show,现代发行版默认安装、输出结构化;旧系统可退化为route -n,但字段格式不同;需捕获输出时应使用popen()而非system()。

c++如何读取并显示系统的路由表信息【实战】

Linux 下用 system() 调用 ip route 最快出结果

直接读取内核路由表需要解析 /proc/net/route 或调用 netlink(复杂且易错),而大多数运维/调试场景只需“显示当前生效的路由”,此时绕过底层、复用系统命令更稳。用 system("ip route show") 一行就能拿到人类可读的输出,适合快速验证或日志记录。

注意:ip route 是 iproute2 套件命令,现代 Linux 发行版默认安装;若旧系统只有 route -n,可改用 system("route -n"),但格式略有不同(列顺序和字段名不一致)。

  • system() 不捕获输出,仅打印到终端——如需后续处理(比如提取某条路由的网关),得换 popen()
  • 确保程序有执行 shell 命令的权限(容器环境可能被禁用)
  • 别在高频率循环里反复调用,ip route 本身开销小,但 fork+exec 有成本

Windows 下必须用 GetIpForwardTable()(IPv4)或 GetIpForwardTable2()(IPv6)

Windows 没有标准命令行路由 dump 工具能稳定覆盖所有接口类型(route print 输出格式不固定,多网卡时容易错行),必须走 Win32 API。核心是获取 MIB_IPFORWARDTABLE 结构体数组,每项含 dwForwardDest(目标)、dwForwardNextHop(下一跳)、dwForwardIfIndex(接口索引)等字段。

关键点:

  • 调用前先 #include 并链接 Iphlpapi.lib
  • GetIpForwardTable() 只支持 IPv4;IPv6 必须用 GetIpForwardTable2(AF_INET6, ...)
  • 返回的 IP 地址是网络字节序,需用 ntohl() 转主机序再格式化为点分十进制
  • 接口索引要配合 GetIfEntry() 才能查到对应网卡名(否则只显示数字)

跨平台封装时别硬写 if-else,优先检查 /proc/net/route 是否存在

想写一份代码跑 Linux 和 WSL?别一上来就 #ifdef _WIN32。实际更可靠的做法是:先尝试打开 /proc/net/route,存在则按 Linux 格式解析;不存在再 fallback 到 Windows API 路径。因为 WSL1/WSL2 的 /proc 是完整的,而某些嵌入式 Linux 可能没挂载 procfs,这时反而该走 netlink。

C++14
C++14

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

下载

/proc/net/route 解析要点:

  • 第一行是表头(如 Iface\tDestination\tGateway\t...\tMetric\t...),需跳过
  • Destination/Gateway 字段是十六进制(小端),例如 00000000 表示 0.0.0.0,0100007F 表示 127.0.0.1(注意字节序翻转)
  • Metric 值为 0 表示直连路由,非 0 通常是静态或动态学习到的路由
  • 不要依赖列数固定——不同内核版本字段数可能增减(比如新增 Use 或 Window 列)

用 netlink(Linux)或 MIB-II(Windows)做实时监听会踩一堆坑

如果需求是“路由变化时立刻通知”,别自己轮询 ip route 或定时读 /proc/net/route。Linux 应监听 NETLINK_ROUTE socket 的 RTM_NEWROUTE/RTM_DELROUTE 消息,Windows 应用 NotifyRouteChange2() 注册回调。但这两种方式都极易出错:

  • netlink 需手动构造 struct nlmsghdr,漏设 NLM_F_REQUEST | NLM_F_DUMP 位会导致收不到初始快照
  • Windows 的 NotifyRouteChange2() 回调运行在新线程,若回调里调用 UI 函数(如 printf)且主线程已退出,会 crash
  • 两者都要求进程有 CAP_NET_ADMIN(Linux)或 SeNetworkConfigurationPrivilege(Windows)权限,普通用户默认没有

真实项目里,90% 的“监听”需求其实只需要每 5 秒 ip route show 一次 diff,既简单又足够用。

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

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

c++ 路由

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

相关专题

更多
504 gateway timeout怎么解决
504 gateway timeout怎么解决

504 gateway timeout的解决办法:1、检查服务器负载;2、优化查询和代码;3、增加超时限制;4、检查代理服务器;5、检查网络连接;6、使用负载均衡;7、监控和日志;8、故障排除;9、增加缓存;10、分析请求。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.27

754

4

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.07

377

5

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

3460

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

269

24

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

2023.06.20

948

5

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.28

1029

10

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

5434

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

5611

25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3248

3

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习