使用GetIfTable获取MIB_IFTABLE和MIB_IFROW获取网络接口信息

130 篇文章 1 订阅

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

使用GetIfTable()获取各个端口信息的时候用到的 _MIB_IFTABLE结构:

typedef struct _MIB_IFTABLE {
  DWORD     dwNumEntries; //得到的端口个数
  MIB_IFROW table[ANY_SIZE]; //得到的各个端口的信息,这个结构才是重点
} MIB_IFTABLE, *PMIB_IFTABLE;

typedef struct _MIB_IFROW {
  WCHAR wszName[MAX_INTERFACE_NAME_LEN];
  DWORD dwIndex;
  DWORD dwType;
  DWORD dwMtu;
  DWORD dwSpeed;
  DWORD dwPhysAddrLen;
  BYTE  bPhysAddr[MAXLEN_PHYSADDR];
  DWORD dwAdminStatus;
  DWORD dwOperStatus;
  DWORD dwLastChange;
  DWORD dwInOctets;
  DWORD dwInUcastPkts;
  DWORD dwInNUcastPkts;
  DWORD dwInDiscards;
  DWORD dwInErrors;
  DWORD dwInUnknownProtos;
  DWORD dwOutOctets;
  DWORD dwOutUcastPkts;
  DWORD dwOutNUcastPkts;
  DWORD dwOutDiscards;
  DWORD dwOutErrors;
  DWORD dwOutQLen;
  DWORD dwDescrLen;
  BYTE  bDescr[MAXLEN_IFDESCR];
} MIB_IFROW, *PMIB_IFROW;

wzsName:包含了该接口的名字(多字节的),具体也不知道哈意思,就是一串数字,有懂的和我说一下

dwIndex:该接口的索引值,比如有多个网卡的时候,每个网卡都有一个索引值,是会随着网卡正在被使用的个数变化的

dwType:该接口的类型,这个类型是被IANA(是个什么协会吧)定义的,有以下几种:

ValueMeaning
IF_TYPE_OTHER 1

Some other type of network interface.

IF_TYPE_ETHERNET_CSMACD 6

An Ethernet network interface.

IF_TYPE_ISO88025_TOKENRING 9

A token ring network interface.

IF_TYPE_PPP 23

A PPP network interface.

IF_TYPE_SOFTWARE_LOOPBACK 24

A software loopback network interface.

IF_TYPE_ATM 37

An ATM network interface.

IF_TYPE_IEEE80211 71

An IEEE 802.11 wireless network interface.

IF_TYPE_TUNNEL 131

A tunnel type encapsulation network interface.

IF_TYPE_IEEE1394 144

An IEEE 1394 (Firewire) high performance serial bus network interface.

其中24是网络回路的网卡(我自己是这样叫的),就是127.0.0.1那个,应该是每个机子都有的吧

一般我们用的是6.

dwMtu:百度一下MTU就知道了,就是该接口的最大传输单元,理解为该通信协议的某一层上面能通过的最大的数据包的大小(以字节为单位)

dwSpeed:该接口最大的传输速率,可是看成是这个接口每秒最多传多大的数据的一个规格,我刚开始的时候以为这是该接口的即时传输速度呢,郁闷

dwPhysAddrLen: bPhysAddr指向的地址的长度

bPhysAddr:指向该接口地址的指针

dwAdminStatus:该接口的管理状态,按我的理解就是人为设定的那个状态:启用/禁用

dwOperStatus:该接口的操作状态,它可以取以下的值,看了下面的值就知道是什么意思了

0 MIB_IF_OPER_STATUS_NON_OPERATIONAL 网络适配器被禁止的状态;

1 MIB_IF_OPER_STATUS_UNREACHABLE 没有连接的状态;

2 MIB_IF_OPER_STATUS_DISCONNECTED 电缆未连接的状态;

3 MIB_IF_OPER_STATUS_CONNECTING 广域网适配器连接中的状态;

4 MIB_IF_OPER_STATUS_CONNECTED 广域网适配器连接上远程对等点的状态;

5 MIB_IF_OPER_STATUS_OPERATIONAL 局域网适配器默认的连接状态;

dwLastChange: 适配器状态最后一次改变的时间;

dwInOctets: 该接口总的收到的数据大小;

dwInUcastPkts As Long '总共收到(unicast包)
dwInNUcastPkts As Long '总共收到(non-unicast包),包括广播包和多点传送包dwInDiscards As Long '收到后丢弃包总数(即使没有错误)
dwInErrors As Long '收到出错包总数
dwInUnknownProtos As Long '收到后因协议不明而丢弃的包总数
dwOutOctets As Long '总共发送(字节)
dwOutUcastPkts As Long '总共发送(unicast包)
dwOutNUcastPkts As Long '总共发送(non-unicast包),包括广播包和多点传送包
dwOutDiscards As Long '发送丢弃包总数(即使没有错误)
dwOutErrors As Long '发送出错包总数
dwOutQLen As Long '发送队列长度
dwDescrLen As Long ' bDescr部分有效长度
bDescr(0 To 255) As Byte '接口描述 也就是在设备管理器上看的到名字

用一秒钟前后得到的dwInOctets数据相减,就是这一秒中该接口的流量,用这个方法就可以计算机子的即时流量了


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取网络使用率,可以通过以下步骤使用C/C++编写程序: 1. 使用系统函数获取网络流量信息,例如在Windows平台上,可以使用GetIfTable和GetIfEntry函数获取网络接口信息和流量统计数据。 2. 计算网络使用率,可以使用流量统计数据计算网络使用率,通常使用以下公式:使用率 = (接收字节数 + 发送字节数) / 带宽 * 时间间隔。 3. 可以使用定时器或循环方式来周期性地获取和计算网络使用率。 以下是一个简单的C++示例代码,可以获取并打印出当前网络使用率: ```c++ #include <iostream> #include <windows.h> #include <iphlpapi.h> #pragma comment(lib, "iphlpapi.lib") int main() { MIB_IFTABLE* ifTable = nullptr; DWORD ifTableSize = 0; // 获取网络接口信息 GetIfTable(ifTable, &ifTableSize, FALSE); if (ifTableSize == 0) { std::cerr << "Failed to get interface table!" << std::endl; return -1; } ifTable = (MIB_IFTABLE*)new char[ifTableSize]; if (GetIfTable(ifTable, &ifTableSize, FALSE) != NO_ERROR) { std::cerr << "Failed to get interface table!" << std::endl; delete[] ifTable; return -1; } // 计算网络使用率 ULONG totalBytes = 0; ULONG totalBandwidth = 0; for (int i = 0; i < ifTable->dwNumEntries; ++i) { MIB_IFROW& ifRow = ifTable->table[i]; if (ifRow.dwType == MIB_IF_TYPE_ETHERNET) { totalBytes += ifRow.dwInOctets + ifRow.dwOutOctets; totalBandwidth += ifRow.dwSpeed; } } static ULONG lastTotalBytes = 0; static ULONG lastTime = GetTickCount(); ULONG currentTime = GetTickCount(); ULONG elapsedTime = (currentTime - lastTime) / 1000; ULONG currentBytes = totalBytes - lastTotalBytes; lastTotalBytes = totalBytes; lastTime = currentTime; float usage = (float)currentBytes / totalBandwidth * 8 / elapsedTime; std::cout << "Network usage: " << usage << " Mbps" << std::endl; delete[] ifTable; return 0; } ``` 需要注意的是,代码中仅仅统计了Ethernet接口的流量信息,并且只计算了单向流量,实际应用中可能需要根据具体需求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值