C++ 获取 Windows 资源监视器中指定进程的网络发送字节数
C++ 获取 Windows 资源监视器中指定进程的网络发送字节数
在 Windows 下,可以使用 GetTcpTable2 函数获取当前系统中所有 TCP 连接的信息,包括每个连接的本地和远程地址、本地和远程端口等。通过遍历这些连接,找到指定进程的 TCP 连接,即可获取其发送字节数。
以下是一个示例代码,演示如何获取指定进程的网络发送字节数:cpp#include
#pragma comment(lib, 'iphlpapi.lib')#pragma comment(lib, 'ws2_32.lib')
// 根据进程名获取进程 IDDWORD GetProcessIdByName(const std::wstring& processName) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { return 0; }
if (Process32First(hSnapshot, &pe32)) { do { if (processName.compare(pe32.szExeFile) == 0) { CloseHandle(hSnapshot); return pe32.th32ProcessID; } } while (Process32Next(hSnapshot, &pe32)); }
CloseHandle(hSnapshot); return 0;}
// 获取指定进程的网络发送字节数ULONGLONG GetProcessNetworkBytesSent(DWORD processId) { MIB_TCPTABLE2* pTcpTable = nullptr; DWORD dwSize = 0;
// 获取 TCP 连接表的大小 if (GetTcpTable2(pTcpTable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER) { pTcpTable = (MIB_TCPTABLE2*)malloc(dwSize); if (pTcpTable == nullptr) { return 0; } } else { return 0; }
// 获取 TCP 连接表 if (GetTcpTable2(pTcpTable, &dwSize, TRUE) == NO_ERROR) { ULONGLONG totalBytesSent = 0;
// 遍历所有 TCP 连接 for (DWORD i = 0; i < pTcpTable->dwNumEntries; i++) { MIB_TCPROW2* pTcpRow = &pTcpTable->table[i]; // 找到指定进程的 TCP 连接 if (pTcpRow->dwOwningPid == processId) { totalBytesSent += pTcpRow->dwBytesSent; } }
free(pTcpTable); return totalBytesSent; }
free(pTcpTable); return 0;}
int main() { std::wstring processName = L'YourProcess.exe'; // 指定进程名 DWORD processId = GetProcessIdByName(processName); if (processId != 0) { ULONGLONG bytesSent = GetProcessNetworkBytesSent(processId); std::cout << '进程 ' << processName << ' 发送的字节数:' << bytesSent << std::endl; } else { std::cout << '未找到该进程' << std::endl; }
return 0;}
代码说明:
GetProcessIdByName函数:根据进程名获取进程 ID。2.GetProcessNetworkBytesSent函数:获取指定进程的网络发送字节数。 - 首先调用GetTcpTable2函数获取 TCP 连接表的大小,然后分配足够的内存。 - 再次调用GetTcpTable2函数获取 TCP 连接表。 - 遍历所有 TCP 连接,找到指定进程的连接,累加其发送字节数。3. 在main函数中,首先指定要查询的进程名,然后调用GetProcessIdByName函数获取进程 ID,最后调用GetProcessNetworkBytesSent函数获取网络发送字节数并打印输出。
注意:
- 需要包含
winsock2.h、iphlpapi.h和tlhelp32.h头文件,并链接iphlpapi.lib和ws2_32.lib库。- 将代码中的YourProcess.exe替换为实际的进程名。- 该代码仅获取 TCP 连接的发送字节数,不包括 UDP 连接。
原文地址: https://www.cveoy.top/t/topic/fSAF 著作权归作者所有。请勿转载和采集!