C++: 获取Windows特定进程网络上下行流量
C++: 获取Windows特定进程网络上下行流量
在Windows系统中,我们经常需要监控特定进程的网络使用情况,例如下载速度、上传速度等。以下C++代码示例可以帮助您实现这一目标。
代码示例
#include <iostream>
#include <Windows.h>
#include <Psapi.h>
// 函数声明
ULONGLONG GetProcessNetworkUsage(DWORD processId);
int main()
{
DWORD processId = 1234; // 替换为你要统计的进程的进程ID
ULONGLONG networkUsage = GetProcessNetworkUsage(processId);
std::cout << 'Process network usage: ' << networkUsage << ' bytes' << std::endl;
return 0;
}
ULONGLONG GetProcessNetworkUsage(DWORD processId)
{
// 获取进程句柄
HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId);
if (processHandle == NULL)
{
std::cerr << 'Failed to open process' << std::endl;
return 0;
}
// 获取进程模块信息
HMODULE modules[1024];
DWORD cbNeeded;
if (!EnumProcessModules(processHandle, modules, sizeof(modules), &cbNeeded))
{
std::cerr << 'Failed to enumerate process modules' << std::endl;
CloseHandle(processHandle);
return 0;
}
// 获取模块文件名
TCHAR moduleName[MAX_PATH];
if (!GetModuleFileNameEx(processHandle, modules[0], moduleName, sizeof(moduleName)))
{
std::cerr << 'Failed to get module file name' << std::endl;
CloseHandle(processHandle);
return 0;
}
// 获取网络统计信息
MIB_TCPROW2 tcpRow;
tcpRow.dwState = MIB_TCP_STATE_ESTAB;
tcpRow.dwLocalAddr = 0;
tcpRow.dwLocalPort = 0;
tcpRow.dwRemoteAddr = 0;
tcpRow.dwRemotePort = 0;
DWORD bufferSize = 0;
DWORD result = GetTcp6Table2(&tcpRow, &bufferSize, TRUE);
if (result == ERROR_INSUFFICIENT_BUFFER)
{
PMIB_TCP6TABLE2 tcpTable = (PMIB_TCP6TABLE2)malloc(bufferSize);
result = GetTcp6Table2(tcpTable, &bufferSize, TRUE);
if (result == NO_ERROR)
{
ULONGLONG totalBytes = 0;
for (DWORD i = 0; i < tcpTable->dwNumEntries; i++)
{
PMIB_TCP6ROW2 tcpRow = &tcpTable->table[i];
if (tcpRow->dwOwningPid == processId)
{
totalBytes += tcpRow->dwBytesSent;
totalBytes += tcpRow->dwBytesReceived;
}
}
free(tcpTable);
CloseHandle(processHandle);
return totalBytes;
}
else
{
std::cerr << 'Failed to get TCP table' << std::endl;
free(tcpTable);
}
}
else
{
std::cerr << 'Failed to get TCP table size' << std::endl;
}
CloseHandle(processHandle);
return 0;
}
代码说明
- 获取进程句柄: 使用
OpenProcess函数获取指定进程的句柄,需要包含Windows.h头文件。 - 获取进程模块信息: 使用
EnumProcessModules和GetModuleFileNameEx函数获取进程模块信息,需要包含Psapi.h头文件,并链接Psapi.lib库文件。 - 获取网络统计信息: 使用
GetTcp6Table2函数获取 IPv6 TCP 连接表,并遍历查找目标进程 ID,累加发送和接收的字节数。
注意:
- 此代码使用了
GetTcp6Table2函数来获取 TCP 统计信息,并假设目标进程使用 IPv6。如果目标进程使用 IPv4,可以使用GetTcpTable2函数来获取 TCP 统计信息。 - 需要在项目设置中添加
Psapi.lib库文件。
希望这份代码示例能够帮助您更好地监控 Windows 系统中特定进程的网络使用情况。
原文地址: https://www.cveoy.top/t/topic/fPHa 著作权归作者所有。请勿转载和采集!