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;
}

代码说明

  1. 获取进程句柄: 使用 OpenProcess 函数获取指定进程的句柄,需要包含 Windows.h 头文件。
  2. 获取进程模块信息: 使用 EnumProcessModulesGetModuleFileNameEx 函数获取进程模块信息,需要包含 Psapi.h 头文件,并链接 Psapi.lib 库文件。
  3. 获取网络统计信息: 使用 GetTcp6Table2 函数获取 IPv6 TCP 连接表,并遍历查找目标进程 ID,累加发送和接收的字节数。

注意:

  • 此代码使用了 GetTcp6Table2 函数来获取 TCP 统计信息,并假设目标进程使用 IPv6。如果目标进程使用 IPv4,可以使用 GetTcpTable2 函数来获取 TCP 统计信息。
  • 需要在项目设置中添加 Psapi.lib 库文件。

希望这份代码示例能够帮助您更好地监控 Windows 系统中特定进程的网络使用情况。

C++: 获取Windows特定进程网络上下行流量

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

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