要获取某个exe的网络发送与接收速率,可以使用Windows API函数来实现。具体步骤如下:

  1. 使用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);
    }
}
  1. 使用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;
}
  1. 使用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进行筛选。

获取某个exe的网络发送与接收速率C++

原文地址: https://www.cveoy.top/t/topic/iigV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录