做网络编程的程序员免不了要与MAC地址打交道,这个128bit的数字串在某种程度上就代表了机器的唯一性,因此在做统计工作时一般都以MAC地址作为标准。 下面介绍两种获取本机MAC地址的方式。1. 通过请求NetBios服务获取MAC地址;2. 通过IpHelpApi获取。 第一种方法要求本机开启了NetBios服务,由于有部分机器已经禁用了这项服务,因此获取时可能失败, 个人比较推荐第二种方法。
1。通过请求NetBios服务获取MAC地址。使用库Netapi32.lib
struct ASTAT
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
};
bool GetMacByNetBios(unsigned char * mac)
{
if(!mac)
{
return false;
}
ASTAT Adapter;
NCB ncb;
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = 0;
Netbios( &ncb );
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = 0;
strcpy( (char *)ncb.ncb_callname, "* " );
ncb.ncb_buffer = (unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
if(Netbios(&ncb) == 0)
{
memcpy(mac, Adapter.adapt.adapter_address, 6);
return true;
}
else
{
memset(mac, 0, 6);
return false;
}
}
2。通过IpHelpApi获取,使用库Iphlpapi.lib
#include <IPHlpApi.h>
bool GetMacByIpHelp(unsigned char * mac)
{
if(!mac)
{
return false;
}
ULONG ulOutBufLen = 0;
if(GetAdaptersInfo(NULL, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW )
{
int nDivisor = sizeof(IP_ADAPTER_INFO);
if(sizeof(time_t) == 8)
nDivisor -= 8;
int nCount = ulOutBufLen / nDivisor;
PIP_ADAPTER_INFO pAdapterInfo = new IP_ADAPTER_INFO[nCount];
if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS )
{
delete[] pAdapterInfo;
memset(mac, 0, 6);
return false;
}
else
{
memcpy(mac, pAdapterInfo->Address, 6);
delete[] pAdapterInfo;
return true;
}
}
else
{
memset(mac, 0, 6);
return false;
}
}
以上两个函数的使用方法如下:
void main (void)
{
unsigned char mac[6];
GetMacByNetBios(mac);
printf("Get MAC by NetBios: %02X%02X%02X%02X%02X%02X/n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
GetMacByNetBios(mac);
printf("Get MAC by IpHelp: %02X%02X%02X%02X%02X%02X/n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
}