使用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(是個什麼協會吧)定義的,有以下幾種:
Value | Meaning |
---|---|
| Some other type of network interface. |
| An Ethernet network interface. |
| A token ring network interface. |
| A PPP network interface. |
| A software loopback network interface. |
| An ATM network interface. |
| An IEEE 802.11 wireless network interface. |
| A tunnel type encapsulation network interface. |
| 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資料相減,就是這一秒中該介面的流量,用這個方法就可以計算機子的即時流量了