程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 獲取MAC地址

獲取MAC地址

編輯:C++入門知識

[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 
                 ) 
        { 
            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; 

// 取得網卡地址信息,返回對應類型網卡的總數量
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庫

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved