获取MAC地址

来源:互联网 发布:人工智能与制造业 ppt 编辑:程序博客网 时间:2024/06/14 05:32
// 定义网卡类型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_APIDWORDBF_GetMacAddr(IN  BFSYS_MAC_T type,                   // 待取得网卡类型OUT BFMacAddrArray *pAddrAry = NULL     // 输出对应网卡类型的地址信息);

// 取得网卡地址信息,返回对应类型网卡的总数量BFLIB_APIDWORDBF_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);}}// 遍历下一个AdapterpIPAdapterInfo = 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且不是虚拟网卡时就认为是物理网卡。