您的位置:首页 > 其它

一分钟学会获取本机网卡物理地址(MAC)

2006-11-03 13:33 591 查看
做网络编程的程序员免不了要与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]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: