[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庫