C++ 获取 Windows 资源监视器网络活动进程的发送和接收速率
要获取 Windows 下资源监视器的网络活动进程中指定进程的发送和接收速率,可以使用 Windows API 函数来实现。
首先,需要使用函数GetTcpTable2获取当前系统中的 TCP 连接信息。这个函数会返回一个MIB_TCPTABLE2结构体,其中包含了所有的 TCP 连接信息。
然后,遍历MIB_TCPTABLE2结构体中的每个连接,找到指定进程的连接。可以通过比较dwOwningPid字段来判断连接所属的进程。
一旦找到指定进程的连接,可以使用GetPerTcpConnectionEStats函数来获取连接的统计信息。这个函数会返回一个TCP_ESTATS_DATA_ROD_v0结构体,其中包含了连接的发送和接收速率。
以下是一个示例代码,展示了如何获取指定进程的网络发送和接收速率:
#include <iostream>
#include <windows.h>
#include <iphlpapi.h>
#include <tcpestats.h>
#pragma comment(lib, "iphlpapi.lib")
int main()
{
DWORD pid = 1234; // 指定进程的 PID
MIB_TCPTABLE2* tcpTable = NULL;
DWORD tcpTableSize = 0;
// 获取TCP连接信息
if (GetTcpTable2(tcpTable, &tcpTableSize, TRUE) == ERROR_INSUFFICIENT_BUFFER)
{
tcpTable = (MIB_TCPTABLE2*)malloc(tcpTableSize);
if (GetTcpTable2(tcpTable, &tcpTableSize, TRUE) != NO_ERROR)
{
std::cout << "Failed to get TCP table." << std::endl;
return 1;
}
}
else
{
std::cout << "Failed to get TCP table size." << std::endl;
return 1;
}
// 遍历TCP连接
for (DWORD i = 0; i < tcpTable->dwNumEntries; i++)
{
MIB_TCPROW2 row = tcpTable->table[i];
// 找到指定进程的连接
if (row.dwOwningPid == pid)
{
TCP_ESTATS_DATA_ROD_v0 stats;
DWORD statsSize = sizeof(stats);
// 获取连接的统计信息
if (GetPerTcpConnectionEStats(&row, TcpConnectionEstatsData, NULL, 0, &stats, statsSize, 0) == NO_ERROR)
{
std::cout << "Process ' << pid << ' send rate: ' << stats.SndCongestionExperienced << ' bytes/s' << std::endl;
std::cout << "Process ' << pid << ' receive rate: ' << stats.RcvDataBytes / stats.RcvDataSegments << ' bytes/s' << std::endl;
}
else
{
std::cout << "Failed to get connection statistics." << std::endl;
}
}
}
free(tcpTable);
return 0;
}
请注意,上述代码仅获取了指定进程的一个连接的发送和接收速率。如果指定进程有多个连接,需要在遍历连接时累加速率值。另外,上述代码仅适用于 TCP 连接,如果需要获取 UDP 连接的速率,需要使用GetUdpTable2函数和UDP_ESTATS_DATA_ROD_v0结构体。
原文地址: https://www.cveoy.top/t/topic/fSC0 著作权归作者所有。请勿转载和采集!