獲取網(wǎng)卡的MAC地址的方法很多,如:Netbios,SNMP,GetAdaptersInfo等。經(jīng)過測試發(fā)現(xiàn) Netbios 方法在網(wǎng)線拔出的情況下獲取不到MAC,而 SNMP 方法有時(shí)會(huì)獲取多個(gè)重復(fù)的網(wǎng)卡的MAC,試來試去還是 GetAdaptersInfo 方法比較好,網(wǎng)線拔出的情況下可以獲取MAC,而且很準(zhǔn)確,不會(huì)重復(fù)獲取網(wǎng)卡。
GetAdaptersInfo 方法也不是十全十美,也存在些問題:
1)如何區(qū)分物理網(wǎng)卡和虛擬網(wǎng)卡;
2)如何區(qū)分無線網(wǎng)卡和有線網(wǎng)卡;
3)“禁用”的網(wǎng)卡獲取不到。
關(guān)于問題1和問題2我的處理辦法是:
區(qū)分物理網(wǎng)卡和虛擬網(wǎng)卡:pAdapter->Description中包含"PCI"是:物理網(wǎng)卡。(試了3臺(tái)機(jī)器可以)
區(qū)分無線網(wǎng)卡和有線網(wǎng)卡:pAdapter->Type為71的是:無線網(wǎng)卡。(試了2個(gè)無線網(wǎng)卡也可以)
現(xiàn)在把代碼貼出來和大家分享:
#include"stdafx.h"
#include
#include
#include"iphlpapi.h"
#pragmacomment(lib,"Iphlpapi.lib")
intmain(intargc,char*argv[])
{
PIP_ADAPTER_INFOpAdapterInfo;
PIP_ADAPTER_INFOpAdapter=NULL;
DWORDdwRetVal=0;
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
ULONGulOutBufLen=sizeof(IP_ADAPTER_INFO);
if(GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)!=ERROR_SUCCESS)
{
GlobalFree(pAdapterInfo);
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(ulOutBufLen);
}
if((dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen))==NO_ERROR)
{
pAdapter=pAdapterInfo;
while(pAdapter)
{
if(
strstr(pAdapter->Description,"PCI")>0//pAdapter->Description中包含"PCI"為:物理網(wǎng)卡
||pAdapter->Type==71 //pAdapter->Type是71為:無線網(wǎng)卡
)
{
printf("--------n");
printf("AdapterName:t%sn",pAdapter->AdapterName);
printf("AdapterDesc:t%sn",pAdapter->Description);
printf("AdapterAddr:t");
for(UINTi=0;iAddressLength;i++)
{
printf("%02X%c",pAdapter->Address[i],
i==pAdapter->AddressLength-1?’n’:’-’);
}
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
{
printf("CalltoGetAdaptersInfofailed.n");
}
return0;
}
GetAdaptersInfo 方法也不是十全十美,也存在些問題:
1)如何區(qū)分物理網(wǎng)卡和虛擬網(wǎng)卡;
2)如何區(qū)分無線網(wǎng)卡和有線網(wǎng)卡;
3)“禁用”的網(wǎng)卡獲取不到。
關(guān)于問題1和問題2我的處理辦法是:
區(qū)分物理網(wǎng)卡和虛擬網(wǎng)卡:pAdapter->Description中包含"PCI"是:物理網(wǎng)卡。(試了3臺(tái)機(jī)器可以)
區(qū)分無線網(wǎng)卡和有線網(wǎng)卡:pAdapter->Type為71的是:無線網(wǎng)卡。(試了2個(gè)無線網(wǎng)卡也可以)
現(xiàn)在把代碼貼出來和大家分享:
#include"stdafx.h"
#include
#include
#include"iphlpapi.h"
#pragmacomment(lib,"Iphlpapi.lib")
intmain(intargc,char*argv[])
{
PIP_ADAPTER_INFOpAdapterInfo;
PIP_ADAPTER_INFOpAdapter=NULL;
DWORDdwRetVal=0;
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
ULONGulOutBufLen=sizeof(IP_ADAPTER_INFO);
if(GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)!=ERROR_SUCCESS)
{
GlobalFree(pAdapterInfo);
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(ulOutBufLen);
}
if((dwRetVal=GetAdaptersInfo(pAdapterInfo,&ulOutBufLen))==NO_ERROR)
{
pAdapter=pAdapterInfo;
while(pAdapter)
{
if(
strstr(pAdapter->Description,"PCI")>0//pAdapter->Description中包含"PCI"為:物理網(wǎng)卡
||pAdapter->Type==71 //pAdapter->Type是71為:無線網(wǎng)卡
)
{
printf("--------n");
printf("AdapterName:t%sn",pAdapter->AdapterName);
printf("AdapterDesc:t%sn",pAdapter->Description);
printf("AdapterAddr:t");
for(UINTi=0;i
{
printf("%02X%c",pAdapter->Address[i],
i==pAdapter->AddressLength-1?’n’:’-’);
}
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
{
printf("CalltoGetAdaptersInfofailed.n");
}
return0;
}