获取MAC地址

// 定义网卡类型
typedef DWORD BFSYS_MAC_T;
#define BFSYS_MAC_ALL          0xFFFFFFFF          // 所有网卡
#define BFSYS_MAC_PHYSICAL     0x00000001          // 物理网卡
#define BFSYS_MAC_WIRELESS     0x00000002          // 无线网卡
#define BFSYS_MAC_VIRTUAL      0x00000004          // 虚拟网卡(比如虚拟机带的虚拟网卡)
#define BFSYS_MAC_UNKNOWN      0x80000000          // 未知类型网卡

// 定义网卡MAC地址结构及数组
typedef struct _BFMAC_ADDR_STR_
{
	BFSYS_MAC_T Type;
	DWORD AddressLength;
	BYTE Address[32];
}BFMACADDR, *PBFMACADDR;
typedef vector<BFMACADDR> BFMacAddrArray;

// 取得网卡地址信息,返回对应类型网卡的总数量
BFLIB_API
DWORD
BF_GetMacAddr(
	IN  BFSYS_MAC_T type,                   // 待取得网卡类型
	OUT BFMacAddrArray *pAddrAry = NULL     // 输出对应网卡类型的地址信息
	);

// 取得网卡地址信息,返回对应类型网卡的总数量
BFLIB_API
DWORD
BF_GetMacAddr(
	IN  BFSYS_MAC_T type,                   // 待取得网卡类型
	OUT BFMacAddrArray *pAddrAry            // 输出对应网卡类型的地址信息
	)
{
	// 清除上次信息
	if (pAddrAry != NULL)
	{
		pAddrAry->clear();
	}

	// 获取Adapter信息
	ULONG ulSize = sizeof(IP_ADAPTER_INFO);
	BYTE *pBuf = new BYTE[ulSize];
	if (pBuf == NULL)
	{
		return 0;
	}
	PIP_ADAPTER_INFO pIPAdapterInfo = (PIP_ADAPTER_INFO)pBuf;	
	DWORD dwRet = ::GetAdaptersInfo(pIPAdapterInfo, &ulSize);

	// 缓冲区溢出则重新申请内存
	if (ERROR_BUFFER_OVERFLOW == dwRet)
	{
		delete[] pBuf ;
		pBuf = NULL;
		pIPAdapterInfo = NULL;
		pBuf = new BYTE[ulSize];
		if (pBuf == NULL)
		{
			return 0;
		}
		pIPAdapterInfo = (PIP_ADAPTER_INFO)pBuf;	
		dwRet = ::GetAdaptersInfo(pIPAdapterInfo, &ulSize); 
	}

	// 获取Adapter信息失败
	if (dwRet != ERROR_SUCCESS)
	{
		delete[] pBuf;
		pBuf = NULL;
		pIPAdapterInfo = NULL;
		return 0;
	}

	// 遍历所有网卡信息
	DWORD dwTotalCount = 0;
	BFMACADDR MacAddr;
	while (pIPAdapterInfo != NULL)
	{
		// 得到MAC地址信息
		memset(&MacAddr, 0, sizeof(MacAddr));
		MacAddr.AddressLength = pIPAdapterInfo->AddressLength;
		for (UINT i=0; i<pIPAdapterInfo->AddressLength; i++)
		{
			MacAddr.Address[i] = pIPAdapterInfo->Address[i];
		}

		// 是否无线网卡
		if (pIPAdapterInfo->Type == 71)
		{
			MacAddr.Type = BFSYS_MAC_WIRELESS;
		}
		// 是否物理网卡
		else if (   pIPAdapterInfo->Type == MIB_IF_TYPE_ETHERNET 
			     && strstr(pIPAdapterInfo->Description, "PCI") > 0
				 )
		{
			MacAddr.Type = BFSYS_MAC_PHYSICAL;
		}
		// 是否虚拟网卡
		else if (   pIPAdapterInfo->Type == MIB_IF_TYPE_ETHERNET 
			     && strstr(pIPAdapterInfo->Description, "Virtual") > 0
				 )
		{
			MacAddr.Type = BFSYS_MAC_VIRTUAL;
		}
		// 其他网卡
		else
		{
			MacAddr.Type = BFSYS_MAC_UNKNOWN;
		}

		// 是否需要的网卡类型
		if ((type & MacAddr.Type) == MacAddr.Type)
		{
			dwTotalCount += 1;
			if (pAddrAry != NULL)
			{
				pAddrAry->push_back(MacAddr);
			}
		}

		// 遍历下一个Adapter
		pIPAdapterInfo = pIPAdapterInfo->Next;		
	}

	// 释放内存
	delete[] pBuf;
	pBuf = NULL;
	pIPAdapterInfo = NULL;

	// 返回获取到的数量	
	return dwTotalCount;
}


需要使用到

#include <Iphlpapi.h>
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库

特别注意:在描述信息里面查"PCI"来确定是否物理网卡是不完全正确的,有的网卡就没有这个信息,可以修改为当类型是MIB_IF_TYPE_ETHERNET且不是虚拟网卡时就认为是物理网卡。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值