weixin_46027762 2023-07-05 09:12 采纳率: 65.7%
浏览 111
已结题

Windows下c++获取网卡的下行流量、丢包率、错包率

我想实时获取Windows网卡的下行流量、丢包率、错包率的信息,用c/c++语言

  • 写回答

5条回答 默认 最新

  • churuxu 2023-07-05 14:59
    关注

    img

    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock2.h>
    #include <windows.h>
    #include <netioapi.h>
    #include <locale.h>
    #include <inttypes.h>
    
    #pragma comment(lib, "iphlpapi.lib")
    
    void show_row(PMIB_IF_ROW2 row){
        if(!row->InterfaceAndOperStatusFlags.HardwareInterface)return;
        if(!row->InterfaceAndOperStatusFlags.ConnectorPresent)return;
        wprintf(L"%ls\n", row->Alias);
        wprintf(L"接收字节数 %"PRIu64"\n", row->InUcastOctets);
        wprintf(L"发送字节数 %"PRIu64"\n", row->OutUcastOctets);
        wprintf(L"接收单播包数 %"PRIu64"\n", row->InUcastPkts);
        wprintf(L"发送单播包数 %"PRIu64"\n", row->OutUcastPkts);
        wprintf(L"接收多播包数 %"PRIu64"\n", row->InNUcastPkts);
        wprintf(L"发送多播包数 %"PRIu64"\n", row->OutNUcastPkts);
        wprintf(L"接收错误包数 %"PRIu64"\n", row->InErrors);    
        wprintf(L"发送错误包数 %"PRIu64"\n", row->OutErrors);
        wprintf(L"接收丢包数 %"PRIu64"\n", row->InDiscards);    
        wprintf(L"发送丢包数 %"PRIu64"\n", row->OutDiscards);
    
        ULONG64 error = row->InErrors + row->OutErrors;
        ULONG64 discard = row->InDiscards + row->OutDiscards;
        ULONG64 total = row->InUcastPkts + row->OutUcastPkts + row->InNUcastPkts + row->OutNUcastPkts + error + discard;
        double error_rate = total?((double)error / (double)total):0;
        double discard_rate = total?((double)discard / (double)total):0;
        
        wprintf(L"错误率 %.4f\n", error_rate);
        wprintf(L"丢包率 %.4f\n", discard_rate);
        printf("\n");
    }
    
    void show_table(PMIB_IF_TABLE2 table){
        int i;
        PMIB_IF_ROW2 row;
        for (i = 0; i < table->NumEntries; i++){
            row = &table->Table[i];
            show_row(row);
        }
    }
    
    void get_if_status(){
        PMIB_IF_TABLE2 table;
        if(0 == GetIfTable2Ex(MibIfTableNormal, &table)){
            show_table(table);
            FreeMibTable(table);
        }else{
            printf("GetIfTable2Ex fail %d\n", (int)GetLastError());
        }
    }
    
    int main(){
        setlocale(0,"");
        while(1){
            get_if_status();        
            Sleep(2000);
            system("cls");
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 创建了问题 7月5日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀