以前也贴过相关的文章,这次再加上,全面一些吧!
做网络编程的程序员免不了要与MAC地址打交道,这个128bit的数字串在某种程度上就代表了机器的唯一性,因此在做统计工作时一般都以MAC地址作为标准。 下面介绍两种获取本机MAC地址的方式。1. 通过请求NetBios服务获取MAC地址;2. 通过IpHelpApi获取。 第一种方法要求本机开启了NetBios服务,由于有部分机器已经禁用了这项服务,因此获取时可能失败, 个人比较推荐第二种方法。
1。通过请求NetBios服务获取MAC地址。使用库Netapi32.lib
2。通过IpHelpApi获取,使用库Iphlpapi.lib
以上两个函数的使用方法如下:
做网络编程的程序员免不了要与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]);
- }