MAC(Medium/Media Access Control)地址,用来表示互联网上每一个站点的标识符,采用十六进制数表示,共六个字节(48位)。其中,前三个字节是由IEEE的注册管理机构RA负责给不同厂家分配的代码(高位24位),也称为"编制上唯一的标识符"(Organizationally Unique Identifier),后三个字节(低位24位)由各厂家自行指派给生产的适配器接口,称为扩展标识符(唯一性)。一个地址块可以生成2个不同的地址。MAC地址实际上就是适配器地址或适配器标识符EUI-48。
Windows中C++获取本机MAC地址的代码函数如下:
#include <WinSock2.h>
#include "Iphlpapi.h"
#pragma comment(lib,"Iphlpapi.lib")
void GetMac(byte * mac)
{
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
if (ERROR_BUFFER_OVERFLOW == nRel)
{
delete pIpAdapterInfo;
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);
}
if (ERROR_SUCCESS == nRel)
{
while (pIpAdapterInfo)
{
memcpy(mac,pIpAdapterInfo->Address,8);
break;//获取到第一个网卡的MAC
}
}
if (pIpAdapterInfo)delete pIpAdapterInfo;
}
void main(int argc, char* argv[])
{
byte mac[8]={0};
GetMac(mac);
printf("本机MAC:");
for (DWORD i = 0; i < 6; i++)
{
if (i < 5)
{
printf("%02X-", mac[i]);
}
else
{
printf("%02X", mac[i]);
}
}
printf("\n");
system("pause");
}
效果图如下:
这个实现代码网上很多,不过感觉比较臃肿,我这里就精简一个版本,并包装好一个函数,供以后需要的时候,随时取用。