Win10系统获取网络上行流量的三种方法
一.方法一
1.查看任务管理器,操作最简单
二.方法二
1.命令行方式
cmd命令:
typeperf -sc 1 "\Network Interface(*)\Bytes Received/sec"
返回内容:
"(PDH-CSV 4.0)","\\DESKTOP-5DUGR3L\Network Interface(Intel[R] Ethernet Connection [14] I219-LM)\Bytes Received/sec","\\DESKTOP-5DUGR3L\Network Interface(Qualcomm QCA9377 802.11ac Wireless Adapter)\Bytes Received/sec"
"08/27/2025 15:07:08.392","0.000000","221.479931"
三.方法三
1.代码方式获取命令信息(VS2022或者QT6下均可用)
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
#include <codecvt>
#include <locale>
QString Widget::executeTypeperfCommand()
{
SECURITY_ATTRIBUTES saAttr = { 0 };
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
HANDLE hReadPipe, hWritePipe;
if (!CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0)) {
std::cerr << "CreatePipe 失败: " << GetLastError() << std::endl;
return "";
}
STARTUPINFO si = { 0 };
si.cb = sizeof(STARTUPINFO);
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
si.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION pi = { 0 };
// 关键修复:使用可修改的WCHAR数组存储命令行,而非常量字符串
WCHAR cmdLine[] = L"cmd /c typeperf -sc 1 \"\\Network Interface(*)\\Bytes Received/sec\"";
// 启动进程(此时cmdLine是可修改的,避免访问冲突)
if (!CreateProcess(
NULL, // 不指定程序路径
cmdLine, // 传入可修改的命令行数组(无需强转)
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi
)) {
std::cerr << "CreateProcess 失败: " << GetLastError() << std::endl;
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
return "";
}
// 关闭写端管道
CloseHandle(hWritePipe);
// 读取输出(与之前逻辑相同)
std::vector<BYTE> buffer(4096);
DWORD bytesRead;
std::wstring wOutput;
while (ReadFile(hReadPipe, buffer.data(), buffer.size(), &bytesRead, NULL) && bytesRead > 0) {
int wideSize = MultiByteToWideChar(CP_ACP, 0, (LPCCH)buffer.data(), bytesRead, NULL, 0);
if (wideSize == 0) continue;
std::vector<WCHAR> wideBuffer(wideSize);
MultiByteToWideChar(CP_ACP, 0, (LPCCH)buffer.data(), bytesRead, wideBuffer.data(), wideSize);
wOutput.append(wideBuffer.data(), wideSize);
}
// 等待进程结束并清理资源
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hReadPipe);
// 转换为UTF-8字符串
int utf8Size = WideCharToMultiByte(CP_UTF8, 0, wOutput.c_str(), wOutput.size(), NULL, 0, NULL, NULL);
if (utf8Size == 0) return "";
std::vector<CHAR> utf8Buffer(utf8Size);
WideCharToMultiByte(CP_UTF8, 0, wOutput.c_str(), wOutput.size(), utf8Buffer.data(), utf8Size, NULL, NULL);
std::string stdStr = std::string(utf8Buffer.data(), utf8Size);
QString q_str = QString::fromStdString(stdStr);
return q_str;
}