C++ 获取特定进程网络发送与接收速率
C++ 获取特定进程网络发送与接收速率
本文介绍如何使用 C++ 和 Windows API 函数获取网络活动进程中特定进程的发送和接收速率。
原理:
- 利用
GetTcpTable2函数获取当前系统中的 TCP 连接信息。2. 遍历 TCP 连接信息,找到与目标进程相关的连接。可以通过比较本地端口或远程端口与目标进程的端口号来判断连接是否相关。3. 对于每个与目标进程相关的连接,使用GetPerTcpConnectionEStats函数获取该连接的发送和接收统计信息。4. 通过比较TCP_ESTATS_TYPE枚举值,可以选择获取发送速率或接收速率。
**代码示例:**cpp#include
// 获取特定进程的发送速率ULONGLONG GetProcessSendRate(DWORD processId) { PMIB_TCPTABLE2 pTcpTable; DWORD dwSize = 0;
// 获取TCP连接信息 if (GetTcpTable2(reinterpret_cast<PMIB_TCPTABLE2>(&dwSize), 0, AF_INET, TCP_TABLE_OWNER_PID_ALL, TCP_CONNECTION_OFFLOAD_STATE_NORMAL, 0) == ERROR_INSUFFICIENT_BUFFER) { pTcpTable = reinterpret_cast<PMIB_TCPTABLE2>(new char[dwSize]); if (GetTcpTable2(pTcpTable, &dwSize, AF_INET, TCP_TABLE_OWNER_PID_ALL, TCP_CONNECTION_OFFLOAD_STATE_NORMAL, 0) == NO_ERROR) { // 遍历TCP连接信息 for (DWORD i = 0; i < pTcpTable->dwNumEntries; i++) { // 找到与特定进程相关的连接 if (pTcpTable->table[i].dwOwningPid == processId) { TCP_ESTATS_SEND_BUFF_ROD_v0 sendStats = { 0 }; DWORD sendStatsSize = sizeof(sendStats);
// 获取发送统计信息 if (GetPerTcpConnectionEStats(reinterpret_cast<PMIB_TCPROW2>(&pTcpTable->table[i]), TcpConnectionEstatsSendBuff, nullptr, 0, 0, &sendStats, &sendStatsSize, 0) == NO_ERROR) { return sendStats.DataBytesOut / sendStats.DataSegsOut; } } } } delete[] reinterpret_cast<char*>(pTcpTable); }
return 0;}
// 获取特定进程的接收速率ULONGLONG GetProcessReceiveRate(DWORD processId) { // 与 GetProcessSendRate 代码类似,只是获取接收统计信息 // ...}
int main() { DWORD processId = 1234; // 替换为特定进程的ID
ULONGLONG sendRate = GetProcessSendRate(processId); ULONGLONG receiveRate = GetProcessReceiveRate(processId);
std::cout << 'Send Rate: ' << sendRate << ' bytes/s' << std::endl; std::cout << 'Receive Rate: ' << receiveRate << ' bytes/s' << std::endl;
return 0;}
注意:
- 以上代码仅适用于 Windows 操作系统。* 需要以管理员权限运行。*
GetProcessReceiveRate函数的实现与GetProcessSendRate类似,区别在于获取的是接收统计信息。
原文地址: https://www.cveoy.top/t/topic/fSCD 著作权归作者所有。请勿转载和采集!