如何在Windows上获取进程的网络delta接收与发送数据?
通过Windows API获取进程网络增量收发数据的方案
Process Explorer的进程级网络流量增量统计,本质是间隔固定时间采样两次进程累计网络收发量,计算差值得到的,底层通过Windows官方提供的API就能实现:
- 首选IP Helper API(iphlpapi.dll)的
GetPerTcpConnectionEStats/GetPerUdpConnectionEStats系列接口,搭配GetTcpTable2/GetUdpTable2使用:先通过后者拿到系统所有TCP/UDP连接对应的进程PID,再用前者查询每个连接的累计收发字节数,按PID聚合后,前后两次采样的差值就是对应进程的网络接收/发送增量。该接口从Windows Vista/Server 2008开始支持,兼容目前所有主流Windows版本。 - 也可以通过WMI性能计数器类实现,直接查询
Win32_PerfFormattedData_Counters_Process等相关类的网络IO统计字段,聚合后计算差值即可,优势是调用更简单,不需要手动处理连接和PID的关联逻辑。
跨语言通用库/框架
不需要自己手动封装原生API的前提下,有多个通用工具库可以实现该需求,几乎覆盖所有主流编程语言:
- Npcap/WinPcap:Windows平台最通用的网络底层采集库,所有主流编程语言都有对应的绑定封装,可以直接捕获网卡的所有数据包,关联端口和进程对应关系后就能统计每个进程的流量增量,同时支持跨平台使用。
- psutil:跨平台系统信息采集库,封装了各操作系统的底层系统API,支持Python、Go、C#、Rust等多语言绑定,直接调用对应进程的网络IO统计接口就能拿到累计收发值,自行计算差值即可得到增量数据,调用逻辑非常简单,适合快速开发。
- 各语言的WMI封装库:比如C#的
System.Management、Python的wmi库、Java的jWMI等,都可以直接调用Windows的WMI接口查询性能计数器数据,不需要引入额外的第三方依赖。
Process Explorer展示的网络delta列,就是默认按1秒的采样间隔计算两次统计值的差值实现的,和上述逻辑完全一致。
内容的提问来源于stack exchange,提问作者Just a learner
相关产品推荐
相关产品推荐

