C++ 使用 PdhAddCounter 获取特定进程网络发送和接收速率

本文将指导您如何使用 Windows API 函数 PdhAddCounter 获取特定进程的网络发送和接收速率。

步骤

  1. 构建性能数据计数器路径字符串:

    此字符串指定要监视的计数器。格式如下:

    • 发送速率: '\Process(<进程名称>)\Network Interface(<网络接口名称>)\Bytes Sent/sec' * 接收速率: '\Process(<进程名称>)\Network Interface(<网络接口名称>)\Bytes Received/sec'

    <进程名称> 替换为目标进程名称,<网络接口名称> 替换为目标网络接口名称。使用 '_Total' 监视所有网络接口。

  2. 创建性能数据计数器对象:

    使用 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) {       // 处理错误   }   ```
    
    
  3. 收集计数器数据并获取当前值:

    使用 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;   ```
    
    
  4. 处理错误和释放资源:

    确保在使用完计数器和查询对象后,使用 PdhCloseQuery 函数关闭它们。

    c++ PdhCloseQuery(hQuery);

注意事项

  • <进程名称><网络接口名称> 替换为实际值。* 使用 L 前缀定义 Unicode 字符串。* 处理所有 PDH_STATUS 返回值以进行适当的错误处理。* 请参考 Microsoft 文档了解更多关于 PdhAddCounter 和相关函数的信息。
C++ 使用 PdhAddCounter 获取特定进程网络发送和接收速率

原文地址: https://www.cveoy.top/t/topic/fSxd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录