windows获取系统网络流量

函数

  DWORD GetIfTable(
         PMIB_IFTABLE pIfTable,
         PULONG pdwSize,
         BOOL bOrder
  );


功能

  获取MIB-II接口列表


参数

  PMIB_IFTABLE pIfTable:接收缓冲区,接收GetIfTable返回的MIB-II接口表

  PULONG pdwSize:pIfTable缓冲区字节数,若缓冲区过小则返回所需大小

  BOOL bOrder:指定pIfTable中返回的接口列表条目是否根据接口索引排序

MIB_IFTABLE结构体


  
  
  1. typedef struct _MIB_IFTABLE {
  2. DWORD dwNumEntries;
  3. MIB_IFROW table[ANY_SIZE];
  4. } MIB_IFTABLE, *PMIB_IFTABLE;
  5. typedef struct _MIB_IFROW {
  6. WCHAR wszName[MAX_INTERFACE_NAME_LEN];
  7. DWORD dwIndex;
  8. DWORD dwType;
  9. DWORD dwMtu;
  10. DWORD dwSpeed;
  11. DWORD dwPhysAddrLen;
  12. BYTE bPhysAddr[MAXLEN_PHYSADDR];
  13. DWORD dwAdminStatus;
  14. DWORD dwOperStatus;
  15. DWORD dwLastChange;
  16. DWORD dwInOctets;
  17. DWORD dwInUcastPkts;
  18. DWORD dwInNUcastPkts;
  19. DWORD dwInDiscards;
  20. DWORD dwInErrors;
  21. DWORD dwInUnknownProtos;
  22. DWORD dwOutOctets;
  23. DWORD dwOutUcastPkts;
  24. DWORD dwOutNUcastPkts;
  25. DWORD dwOutDiscards;
  26. DWORD dwOutErrors;
  27. DWORD dwOutQLen;
  28. DWORD dwDescrLen;
  29. BYTE bDescr[MAXLEN_IFDESCR];
  30. } MIB_IFROW, *PMIB_IFROW;

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366836(v=vs.85).aspx

返回值

  成功返回NO_ERROR,否则返回值即错误码


头文件和引用库

  #include <IPHlpApi.h>   
  #pragma comment(lib, "IPHlpApi.lib")


使用方法



  
  
  1. /*获取MIB-II接口表大小*/
  2. DWORD dwBufferLen = 0;
  3. GetIfTable( NULL, &dwBufferLen, 0);
  4. /*创建MIB-II接口表*/
  5. PMIB_IFTABLE pMibIfTable = (MIB_IFTABLE*) malloc(dwBufferLen);
  6. /*获取MIB-II接口表*/
  7. DWORD dwRet = GetIfTable(pMibIfTable, &dwBufferLen, 0);
  8. if(NO_ERROR != dwRet)
  9. {
  10. std:: cout<< "GetIfTable != NO_ERROR, ErrorCode="<<dwRet<< std:: endl;
  11. free(pMibIfTable);
  12. return false;
  13. }
细说MIB_IFROW结构体成员

  dwType:接口类型,例如IF_TYPE_ETHERNET_CSMACD=6, Ethernet网络接口;IF_TYPE_SOFTWARE_LOOPBACK=24,软件回环测试网络接口。23号之前的网络接口可用来统计系统流量。

  dwSpeed:接口速度,单位bps,可用来计算网络带宽

  bPhysAddr:接口网卡的MAC地址

  dwInOctets:接收的字节数,自系统启动,可用来统计系统网络流量。
  dwOutOctets:发送的字节数,自系统启动,可用来统计系统网络流量。

获取网络带宽


  
  
  1. bool GetNetworkBandwithByMidTable(int &iMbsBandwidth)
  2. {
  3. /*获取MIB-II接口表大小*/
  4. DWORD dwBufferLen = 0;
  5. GetIfTable( NULL, &dwBufferLen, 0);
  6. /*创建MIB-II接口表*/
  7. PMIB_IFTABLE pMibIfTable = (MIB_IFTABLE*) malloc(dwBufferLen);
  8. /*获取MIB-II接口表*/
  9. DWORD dwRet = GetIfTable(pMibIfTable, &dwBufferLen, 0);
  10. if(NO_ERROR != dwRet)
  11. {
  12. std:: cout<< "GetIfTable != NO_ERROR, ErrorCode="<<dwRet<< std:: endl;
  13. free(pMibIfTable);
  14. return false;
  15. }
  16. iMbsBandwidth = INT_MAX;
  17. /*多网卡*/
  18. for( int i = 0; i != pMibIfTable->dwNumEntries; ++i)
  19. {
  20. if (pMibIfTable->table[i].dwType <= 23)
  21. {
  22. int iTmp = static_cast< int>(pMibIfTable->table[i].dwSpeed/ 1000/ 1000);
  23. if(iTmp != 0 && iTmp < iMbsBandwidth)
  24. iMbsBandwidth = iTmp;
  25. }
  26. }
  27. free(pMibIfTable);
  28. if(iMbsBandwidth == INT_MAX)
  29. return false;
  30. return true;
  31. }

网卡的传输速度有10Mbps、100Mbps、1000Mbps,查看网卡速度的方法:设备管理器—网络适配器—选择网卡—属性—高级—连接速度和双工模式—值—下拉菜单中的最大值。

网络带宽由多种因素决定,例如为连接在只具备100M传输速度的双绞线上的计算机配置1000M的网卡就是一种浪费,因为其至多也只能实现100M的传输速率。

故网络带宽为各种物理介质中的最小值,可认为是所有网卡传输速度的最小值(且不为0)。


获取发送比特数和接收比特数,自系统启动



  
  
  1. bool GetStatisticOfSysNetworkFlow(DWORD &dwbitTotalRecv, DWORD &dwbitTotalSend)
  2. {
  3. /*获取MIB-II接口表大小*/
  4. DWORD dwBufferLen = 0;
  5. GetIfTable( NULL, &dwBufferLen, 0);
  6. /*创建MIB-II接口表*/
  7. PMIB_IFTABLE pMibIfTable = (MIB_IFTABLE*) malloc(dwBufferLen);
  8. /*获取MIB-II接口表*/
  9. DWORD dwRet = GetIfTable(pMibIfTable, &dwBufferLen, 0);
  10. if(NO_ERROR != dwRet)
  11. {
  12. std:: cout<< "GetIfTable != NO_ERROR, ErrorCode="<<dwRet<< std:: endl;
  13. free(pMibIfTable);
  14. return false;
  15. }
  16. dwbitTotalRecv = dwbitTotalSend = 0;
  17. /*多网卡*/
  18. for( int i = 0; i != pMibIfTable->dwNumEntries; ++i)
  19. {
  20. if (pMibIfTable->table[i].dwType <= 23)
  21. {
  22. dwbitTotalRecv += pMibIfTable->table[i].dwInOctets;
  23. dwbitTotalSend += pMibIfTable->table[i].dwOutOctets;
  24. }
  25. }
  26. /*Byte转bit*/
  27. dwbitTotalRecv *= 8;
  28. dwbitTotalSend *= 8;
  29. free(pMibIfTable);
  30. return true;
  31. }

计算每秒发送比特数和每秒接收比特数


  
  
  1. bool GetSysNetworkFlowByMidTable(DWORD &dwbpsRecv, DWORD &dwbpsSend)
  2. {
  3. /*首次获取*/
  4. DWORD dwTotalRecv1 = 0, dwTotalSend1 = 0;
  5. if(!GetStatisticOfSysNetworkFlow(dwTotalRecv1, dwTotalSend1))
  6. {
  7. printf( "GetStatisticOfSysNetworkFlow == false\n");
  8. return false;
  9. }
  10. Sleep( 1000);
  11. /*再取*/
  12. DWORD dwTotalRecv2 = 0, dwTotalSend2 = 0;
  13. if(!GetStatisticOfSysNetworkFlow(dwTotalRecv2, dwTotalSend2))
  14. {
  15. printf( "GetStatisticOfSysNetworkFlow == false\n");
  16. return false;
  17. }
  18. /*计算*/
  19. dwbpsRecv = dwTotalRecv2 - dwTotalRecv1;
  20. dwbpsSend = dwTotalSend2 - dwTotalSend1;
  21. return true;
  22. }

注:Windows Performance Counter性能计数器的Network Interface对象能够获取系统网络数据,经验证在Win7下Performance Counter可能不存在Network Interface对象,导致程序运行失败。


转载自:https://blog.csdn.net/rongxiaojun1989/article/details/42395687

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Windows API中的Performance Data Helper (PDH)来获取网络接口的流量统计数据。以下是一个使用PDH库获取网络接口流量的示例程序: ```cpp #include <windows.h> #include <pdh.h> #include <pdhmsg.h> #include <iostream> #include <string> #pragma comment(lib, "pdh.lib") int main() { PDH_HQUERY query = NULL; PDH_HCOUNTER counter_in = NULL; PDH_HCOUNTER counter_out = NULL; // 定义查询语句和计数器对象 PdhOpenQuery(NULL, NULL, &query); std::wstring network_interface = L"\\Network Interface(*)\\Bytes Received/sec"; PdhAddCounter(query, network_interface.c_str(), NULL, &counter_in); network_interface = L"\\Network Interface(*)\\Bytes Sent/sec"; PdhAddCounter(query, network_interface.c_str(), NULL, &counter_out); // 开始查询 PdhCollectQueryData(query); while (true) { PDH_FMT_COUNTERVALUE value_in; PDH_FMT_COUNTERVALUE value_out; // 获取流量数据 PdhCollectQueryData(query); PdhGetFormattedCounterValue(counter_in, PDH_FMT_DOUBLE, NULL, &value_in); PdhGetFormattedCounterValue(counter_out, PDH_FMT_DOUBLE, NULL, &value_out); // 输出流量信息 std::cout << "Bytes Received/sec: " << value_in.doubleValue << std::endl; std::cout << "Bytes Sent/sec: " << value_out.doubleValue << std::endl; Sleep(1000); // 等待1秒钟 } // 释放资源 PdhRemoveCounter(counter_in); PdhRemoveCounter(counter_out); PdhCloseQuery(query); return 0; } ``` 在Windows系统上编译运行该程序,即可获取当前网络接口的流量统计数据。注意,该程序需要管理员权限才能访问网络接口数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值