1. 程式人生 > >使用GetIfTable獲取MIB_IFTABLE和MIB_IFROW獲取網路介面資訊

使用GetIfTable獲取MIB_IFTABLE和MIB_IFROW獲取網路介面資訊

#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資料相減,就是這一秒中該介面的流量,用這個方法就可以計算機子的即時流量了