C++ 获取 Windows 10 资源监视器中进程网络流量
要获取 Windows 10 下资源监视器中网络活动的进程发送和接收流量,你可以使用 Windows API 函数来实现。以下是一个示例代码,它使用 GetTcpTable2 函数来获取 TCP 连接信息,并使用 GetProcessIdOfTcpEntry 函数来获取进程 ID。然后,使用 GetProcessImageFileName 函数来获取进程的可执行文件路径,并使用 GetProcessIoCounters 函数来获取进程的 I/O 计数器信息。
#include <iostream>
#include <windows.h>
#include <iphlpapi.h>
#include <psapi.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "psapi.lib")
int main()
{
MIB_TCPTABLE2* pTcpTable;
DWORD dwSize = 0;
// 获取TCP连接信息
if (GetTcpTable2(pTcpTable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER)
{
pTcpTable = (MIB_TCPTABLE2*)malloc(dwSize);
if (GetTcpTable2(pTcpTable, &dwSize, TRUE) != NO_ERROR)
{
free(pTcpTable);
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 < pTcpTable->dwNumEntries; i++)
{
MIB_TCPROW2 tcpRow = pTcpTable->table[i];
// 获取进程ID
DWORD dwProcessId = GetProcessIdOfTcpEntry(&tcpRow);
// 获取进程可执行文件路径
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId);
if (hProcess != NULL)
{
CHAR szProcessPath[MAX_PATH];
if (GetProcessImageFileNameA(hProcess, szProcessPath, MAX_PATH) > 0)
{
std::cout << "Process ID: " << dwProcessId << std::endl;
std::cout << "Process Path: " << szProcessPath << std::endl;
// 获取进程的I/O计数器信息
IO_COUNTERS ioCounters;
if (GetProcessIoCounters(hProcess, &ioCounters))
{
std::cout << "Bytes Sent: " << ioCounters.WriteTransferCount << std::endl;
std::cout << "Bytes Received: " << ioCounters.ReadTransferCount << std::endl;
}
}
CloseHandle(hProcess);
}
}
free(pTcpTable);
return 0;
}
请注意,此代码仅获取 TCP 连接的进程发送和接收流量。如果你想获取其他类型的网络连接(如 UDP 连接),你需要相应地修改代码。此外,为了使用这些 Windows API 函数,你需要包含相应的头文件,并链接相应的库文件。
原文地址: https://www.cveoy.top/t/topic/fQ6k 著作权归作者所有。请勿转载和采集!