获取某个exe的网络发送与接收速率C++
要获取某个exe的网络发送与接收速率,可以使用Windows API函数来实现。具体步骤如下:
- 使用
GetTcpTable2函数获取当前系统的TCP连接信息。该函数可以获取到每个TCP连接的本地地址、远程地址、本地端口、远程端口等信息。
#include <winsock2.h>
#include <iphlpapi.h>
#pragma comment(lib, "iphlpapi.lib")
void GetTcpConnections()
{
MIB_TCPTABLE2* pTcpTable = NULL;
DWORD dwSize = 0;
// 获取TCP连接表大小
if (GetTcpTable2(pTcpTable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER)
{
// 分配内存
pTcpTable = (MIB_TCPTABLE2*)malloc(dwSize);
// 获取TCP连接表
if (GetTcpTable2(pTcpTable, &dwSize, TRUE) == NO_ERROR)
{
// 遍历TCP连接
for (DWORD i = 0; i < pTcpTable->dwNumEntries; i++)
{
MIB_TCPROW2 tcpRow = pTcpTable->table[i];
// 获取进程ID
DWORD dwProcessId = tcpRow.dwOwningPid;
// 进一步判断进程ID是否为目标进程ID
// 如果是目标进程ID,可以获取到该TCP连接的发送与接收速率等信息
}
}
free(pTcpTable);
}
}
- 使用
GetProcessId函数获取指定exe文件的进程ID。如果需要获取的是当前运行的exe的网络速率,可以使用GetCurrentProcessId函数获取当前进程的ID。
#include <windows.h>
DWORD GetProcessIdByName(const TCHAR* szProcessName)
{
DWORD dwProcessId = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnapshot, &pe32))
{
do
{
if (_tcscmp(pe32.szExeFile, szProcessName) == 0)
{
dwProcessId = pe32.th32ProcessID;
break;
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
}
return dwProcessId;
}
- 使用
GetPerTcpConnectionEStats函数获取指定TCP连接的发送与接收速率等信息。
#include <winsock2.h>
#include <ws2tcpip.h>
#include <mstcpip.h>
#pragma comment(lib, "ws2_32.lib")
void GetTcpConnectionStats(DWORD dwProcessId, MIB_TCPROW2 tcpRow)
{
PMIB_TCPROW_OWNER_PID pTcpRowOwnerPid = (PMIB_TCPROW_OWNER_PID)&tcpRow;
TCP_ESTATS_PATH_ROD_v0 PathStats;
// 初始化PathStats结构体
memset(&PathStats, 0, sizeof(PathStats));
PathStats.EnableCollection = TRUE;
// 获取TCP连接的发送与接收速率等信息
if (GetPerTcpConnectionEStats(pTcpRowOwnerPid, TcpConnectionEstatsPath, NULL, 0, sizeof(PathStats), (PUCHAR)&PathStats, 0, 0) == NO_ERROR)
{
// 获取发送速率
ULONGLONG ulSendSpeed = PathStats.DataBytesOut / PathStats.TimeStamp;
// 获取接收速率
ULONGLONG ulReceiveSpeed = PathStats.DataBytesIn / PathStats.TimeStamp;
// TODO: 处理发送与接收速率等信息
}
}
完整的示例代码如下:
#include <winsock2.h>
#include <iphlpapi.h>
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <ws2tcpip.h>
#include <mstcpip.h>
#include <tlhelp32.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
DWORD GetProcessIdByName(const TCHAR* szProcessName)
{
DWORD dwProcessId = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnapshot, &pe32))
{
do
{
if (_tcscmp(pe32.szExeFile, szProcessName) == 0)
{
dwProcessId = pe32.th32ProcessID;
break;
}
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
}
return dwProcessId;
}
void GetTcpConnectionStats(DWORD dwProcessId, MIB_TCPROW2 tcpRow)
{
PMIB_TCPROW_OWNER_PID pTcpRowOwnerPid = (PMIB_TCPROW_OWNER_PID)&tcpRow;
TCP_ESTATS_PATH_ROD_v0 PathStats;
// 初始化PathStats结构体
memset(&PathStats, 0, sizeof(PathStats));
PathStats.EnableCollection = TRUE;
// 获取TCP连接的发送与接收速率等信息
if (GetPerTcpConnectionEStats(pTcpRowOwnerPid, TcpConnectionEstatsPath, NULL, 0, sizeof(PathStats), (PUCHAR)&PathStats, 0, 0) == NO_ERROR)
{
// 获取发送速率
ULONGLONG ulSendSpeed = PathStats.DataBytesOut / PathStats.TimeStamp;
// 获取接收速率
ULONGLONG ulReceiveSpeed = PathStats.DataBytesIn / PathStats.TimeStamp;
// TODO: 处理发送与接收速率等信息
}
}
void GetTcpConnections()
{
MIB_TCPTABLE2* pTcpTable = NULL;
DWORD dwSize = 0;
// 获取TCP连接表大小
if (GetTcpTable2(pTcpTable, &dwSize, TRUE) == ERROR_INSUFFICIENT_BUFFER)
{
// 分配内存
pTcpTable = (MIB_TCPTABLE2*)malloc(dwSize);
// 获取TCP连接表
if (GetTcpTable2(pTcpTable, &dwSize, TRUE) == NO_ERROR)
{
// 遍历TCP连接
for (DWORD i = 0; i < pTcpTable->dwNumEntries; i++)
{
MIB_TCPROW2 tcpRow = pTcpTable->table[i];
// 获取进程ID
DWORD dwProcessId = tcpRow.dwOwningPid;
// 进一步判断进程ID是否为目标进程ID
// 如果是目标进程ID,可以获取到该TCP连接的发送与接收速率等信息
if (dwProcessId == GetProcessIdByName(_T("目标exe名称")))
{
GetTcpConnectionStats(dwProcessId, tcpRow);
}
}
}
free(pTcpTable);
}
}
int main()
{
// 初始化Winsock
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("WSAStartup failed.\n");
return 1;
}
GetTcpConnections();
// 清理Winsock
WSACleanup();
return 0;
}
注意:以上代码只能获取到指定进程的TCP连接的发送与接收速率等信息,无法获取到UDP连接的速率信息。如果需要获取UDP连接的速率信息,可以使用GetUdpTable函数获取UDP连接表,然后根据目标进程ID进行筛选。
原文地址: https://www.cveoy.top/t/topic/iigV 著作权归作者所有。请勿转载和采集!