一台機器上可能有多個網絡卡,每乙個網絡卡只有乙個mac位址,但是每乙個網絡卡可能配置有多個ip位址;如平常的膝上型電腦中,就會有無線網絡卡和有線網絡卡(網線介面)兩種;因此,如果要獲得本機所有網絡卡的ip和mac位址資訊,則必須順序獲得每個網絡卡,再依次獲取其資訊等;在windows sdk中,用ip_adapter_info結構體儲存網絡卡資訊,包括網絡卡名、網絡卡描述、網絡卡mac位址、網絡卡ip等,該結構體的主要描述如下所示:
typedef struct _ip_adapter_info
ip_adapter_info,
由於可能有多個網絡卡,因此struct _ip_adapter_info* next欄位為乙個鍊錶結構指標,由於乙個網絡卡可能有多個ip,因此ip_addr_string欄位應該也是乙個鍊錶結構,其資訊如下所示:
typedef struct _ip_addr_string
ip_addr_string,
ip_addr_string結構也是乙個鍊錶節點
綜上所述,用下圖來描述網絡卡的結構儲存資訊,也許更明朗:
程式執行結果如下圖所示:
獲取網絡卡的mac位址的方法很多,如:netbios,snmp,getadaptersinfo等。
獲取網絡卡的mac位址的方法很多,如:netbios,snmp,getadaptersinfo等。經過測試發現 netbios 方法在網線拔出的情況下獲取不到mac,而 snmp 方法有時會獲取多個重複的網絡卡的mac,試來試去還是 getadaptersinfo 方法比較好,網線拔出的情況下可以獲取mac,而且很準確,不會重複獲取網絡卡。
getadaptersinfo 方法也不是十全十美,也存在些問題:
1)如何區分物理網絡卡和虛擬網絡卡;
2)如何區分無線網絡卡和有線網絡卡;
3)「禁用」的網絡卡獲取不到。
關於問題1和問題2我的處理辦法是:
區分物理網絡卡和虛擬網絡卡:padapter->description中包含"pci"是:物理網絡卡。(試了3臺機器可以)
區分無線網絡卡和有線網絡卡:padapter->type為71的是:無線網絡卡。(試了2個無線網絡卡也可以)
現在把**貼出來和大家分享: #include"stdafx.h"
#include
#include
#include"iphlpapi.h"
#pragmacomment(lib,"iphlpapi.lib")
intmain(intargc,char*argv)
if((dwretval=getadaptersinfo(padapterinfo,&uloutbuflen))==no_error)
printf("adaptertype:t%dn",padapter->type);
printf("ipaddress:t%sn",padapter->ipaddresslist.ipaddress.string);
printf("ipmask:t%sn",padapter->ipaddresslist.ipmask.string);
}padapter=padapter->next;}}
else
return0;}
獲取網絡卡MAC位址
做網路程式設計的程式設計師免不了要與mac位址打交道,這個128bit的數字串在某種程度上就代表了機器的唯一性,因此在做統計工作時一般都以mac位址作為標準。下面介紹兩種獲取本機mac位址的方式。1.通過請求netbios服務獲取mac位址 2.通過iphelpapi獲取。第一種方法要求本機開啟了n...
獲取指定網絡卡的MAC位址
由於終端裝置多網絡卡使用的問題,以前使用netbios 獲取網絡卡mac位址的方法可能導致不可靠的問題。現推薦大家使用如下方法實現 cstring getlicense cstring strmac cstring getmacbyname cstring strname strcat szfile...
獲取遠端網絡卡MAC位址
出自 朋友mingal急問我有關獲取遠端網絡卡mac位址的asp.net實現。我一開始以為是獲取本機mac位址,說了幾種方法給他。由於他還需要獲取伺服器 本機 相關資訊,如硬碟序列號 cpu資訊等。於是介紹了個wmi方法給他 using system.management string strmac...