C++ 使用 PdhAddCounter 获取特定进程网络发送和接收速率
C++ 使用 PdhAddCounter 获取特定进程网络发送和接收速率
本文将指导您如何使用 Windows API 函数 PdhAddCounter 获取特定进程的网络发送和接收速率。
步骤
-
构建性能数据计数器路径字符串:
此字符串指定要监视的计数器。格式如下:
- 发送速率:
'\Process(<进程名称>)\Network Interface(<网络接口名称>)\Bytes Sent/sec'* 接收速率:'\Process(<进程名称>)\Network Interface(<网络接口名称>)\Bytes Received/sec'
将
<进程名称>替换为目标进程名称,<网络接口名称>替换为目标网络接口名称。使用'_Total'监视所有网络接口。 - 发送速率:
-
创建性能数据计数器对象:
使用
PdhOpenQuery函数创建查询对象,然后使用PdhAddCounter函数将计数器路径字符串添加到该对象。// 创建查询对象 status = PdhOpenQuery(NULL, 0, &hQuery); if (status != ERROR_SUCCESS) { // 处理错误 } // 添加发送速率计数器 status = PdhAddCounter(hQuery, L'\Process(<进程名称>)\Network Interface(<网络接口名称>)\Bytes Sent/sec', 0, &hCounterSent); if (status != ERROR_SUCCESS) { // 处理错误 } // 添加接收速率计数器 status = PdhAddCounter(hQuery, L'\Process(<进程名称>)\Network Interface(<网络接口名称>)\Bytes Received/sec', 0, &hCounterReceived); if (status != ERROR_SUCCESS) { // 处理错误 } ``` -
收集计数器数据并获取当前值:
使用
PdhCollectQueryData函数收集数据,然后使用PdhGetFormattedCounterValue函数获取格式化的计数器值。// 收集计数器数据 status = PdhCollectQueryData(hQuery); if (status != ERROR_SUCCESS) { // 处理错误 } // 获取发送速率 status = PdhGetFormattedCounterValue(hCounterSent, PDH_FMT_DOUBLE, NULL, &counterValue); if (status != ERROR_SUCCESS) { // 处理错误 } double bytesSentPerSec = counterValue.doubleValue; // 获取接收速率 status = PdhGetFormattedCounterValue(hCounterReceived, PDH_FMT_DOUBLE, NULL, &counterValue); if (status != ERROR_SUCCESS) { // 处理错误 } double bytesReceivedPerSec = counterValue.doubleValue; ``` -
处理错误和释放资源:
确保在使用完计数器和查询对象后,使用
PdhCloseQuery函数关闭它们。c++ PdhCloseQuery(hQuery);
注意事项
- 将
<进程名称>和<网络接口名称>替换为实际值。* 使用L前缀定义 Unicode 字符串。* 处理所有PDH_STATUS返回值以进行适当的错误处理。* 请参考 Microsoft 文档了解更多关于PdhAddCounter和相关函数的信息。
原文地址: https://www.cveoy.top/t/topic/fSxd 著作权归作者所有。请勿转载和采集!