当前位置:编程学习 > C/C++ >>

获取MAC地址

[cpp]
// 定义网卡类型  
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     // 输出对应网卡类型的地址信息  
    ); 

// 定义网卡类型
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     // 输出对应网卡类型的地址信息
 );
[cpp]
// 取得网卡地址信息,返回对应类型网卡的总数量  
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 
                 ) 
        { 
          

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,