Windows C++ 获取特定进程网络流量发送和接收速率
以下是一个示例代码,可以在Windows下获取特定进程的网络流量的发送和接收速率。
#include <iostream>
#include <windows.h>
#include <wininet.h>
#include <psapi.h>
#pragma comment(lib, 'wininet.lib')
#pragma comment(lib, 'psapi.lib')
// 获取特定进程的网络流量的发送和接收速率
void GetProcessNetworkUsage(DWORD processId, ULONGLONG& sendRate, ULONGLONG& receiveRate)
{
// 获取进程句柄
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processId);
if (hProcess == NULL)
{
std::cout << 'Failed to open process.' << std::endl;
return;
}
// 获取进程模块句柄
HMODULE hModule;
DWORD cbNeeded;
if (!EnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbNeeded))
{
std::cout << 'Failed to enumerate process modules.' << std::endl;
CloseHandle(hProcess);
return;
}
// 获取进程模块文件路径
TCHAR szModulePath[MAX_PATH];
if (!GetModuleFileNameEx(hProcess, hModule, szModulePath, sizeof(szModulePath) / sizeof(TCHAR)))
{
std::cout << 'Failed to get module file name.' << std::endl;
CloseHandle(hProcess);
return;
}
// 打开进程的网络连接
DWORD dwFlags = 0;
HANDLE hInternet = InternetOpen(L'NetworkUsage', INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, dwFlags);
if (hInternet == NULL)
{
std::cout << 'Failed to open internet.' << std::endl;
CloseHandle(hProcess);
return;
}
// 获取进程的网络流量信息
INTERNET_CACHE_ENTRY_INFO info;
memset(&info, 0, sizeof(info));
info.dwStructSize = sizeof(info);
if (!GetUrlCacheEntryInfo(szModulePath, &info, &cbNeeded))
{
std::cout << 'Failed to get cache entry info.' << std::endl;
InternetCloseHandle(hInternet);
CloseHandle(hProcess);
return;
}
// 计算发送和接收速率
ULONGLONG sendBytes = info.dwHitRate;
ULONGLONG receiveBytes = info.dwSizeLow;
ULONGLONG elapsedTime = GetTickCount64() - info.dwPostCheckDate;
sendRate = sendBytes * 1000 / elapsedTime;
receiveRate = receiveBytes * 1000 / elapsedTime;
// 关闭句柄
InternetCloseHandle(hInternet);
CloseHandle(hProcess);
}
int main()
{
DWORD processId = 1234; // 替换为你要监测的进程ID
ULONGLONG sendRate, receiveRate;
GetProcessNetworkUsage(processId, sendRate, receiveRate);
std::cout << 'Send Rate: ' << sendRate << ' bytes/s' << std::endl;
std::cout << 'Receive Rate: ' << receiveRate << ' bytes/s' << std::endl;
return 0;
}
请注意,此代码使用了Windows API函数 'OpenProcess'、'EnumProcessModules' 和 'GetModuleFileNameEx' 来获取进程模块文件路径,然后使用 'GetUrlCacheEntryInfo' 函数来获取进程的网络流量信息。请确保在编译代码时链接 'wininet.lib' 和 'psapi.lib' 库。
原文地址: https://www.cveoy.top/t/topic/fQlU 著作权归作者所有。请勿转载和采集!