C++ 获取 Windows 指定进程网络流量
要获取 Windows 下指定进程的发送和接收网络流量,可以使用 Windows API 函数来实现。以下是一个使用 C++ 编写的示例代码:
#include <iostream>
#include <windows.h>
#include <iphlpapi.h>
#include <assert.h>
// 链接 IPHlpAPI.lib 库
#pragma comment(lib, "IPHlpAPI.lib")
// 获取指定进程的网络流量
void GetProcessNetworkTraffic(DWORD processId)
{
MIB_TCPTABLE_OWNER_PID tcpTable;
DWORD size = sizeof(tcpTable);
// 获取 TCP 连接表
if (GetExtendedTcpTable(&tcpTable, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) == ERROR_SUCCESS)
{
// 遍历 TCP 连接表
for (DWORD i = 0; i < tcpTable.dwNumEntries; i++)
{
MIB_TCPROW_OWNER_PID tcpRow = tcpTable.table[i];
if (tcpRow.dwOwningPid == processId)
{
std::cout << 'Local Address: ' << (tcpRow.dwLocalAddr & 0xFF) << '.' << ((tcpRow.dwLocalAddr >> 8) & 0xFF) << '.' << ((tcpRow.dwLocalAddr >> 16) & 0xFF) << '.' << ((tcpRow.dwLocalAddr >> 24) & 0xFF) << ':' << ntohs((u_short)tcpRow.dwLocalPort) << std::endl;
std::cout << 'Remote Address: ' << (tcpRow.dwRemoteAddr & 0xFF) << '.' << ((tcpRow.dwRemoteAddr >> 8) & 0xFF) << '.' << ((tcpRow.dwRemoteAddr >> 16) & 0xFF) << '.' << ((tcpRow.dwRemoteAddr >> 24) & 0xFF) << ':' << ntohs((u_short)tcpRow.dwRemotePort) << std::endl;
std::cout << 'State: ' << tcpRow.dwState << std::endl;
std::cout << 'Process ID: ' << tcpRow.dwOwningPid << std::endl;
std::cout << '--------------------------------------' << std::endl;
}
}
}
else
{
std::cout << 'GetExtendedTcpTable failed with error: ' << GetLastError() << std::endl;
}
}
int main()
{
DWORD processId = 1234; // 替换为要获取网络流量的进程 ID
GetProcessNetworkTraffic(processId);
return 0;
}
上述代码使用了 GetExtendedTcpTable 函数来获取 TCP 连接表,并遍历表中的每个连接。通过比较连接的 dwOwningPid 字段与指定的进程 ID,可以筛选出指定进程的连接。然后,可以获取连接的本地地址、远程地址、状态和进程 ID 等信息。
请注意,上述代码仅适用于获取 TCP 连接的网络流量。如果需要获取 UDP 连接的网络流量,可以使用 GetExtendedUdpTable 函数,并相应地更改代码。
原文地址: https://www.cveoy.top/t/topic/fSEu 著作权归作者所有。请勿转载和采集!