获取MAC地址有很多方法,这里大概列举7种方法:
方法1:解析命令ipconfig /all
BOOL GetMacByCmd(LPSTR lpszString, int nMaxStringLen)
{
//命令行输出缓冲大小
const long MAX_COMMAND_SIZE = 10000;
//获取MAC命令行
WCHAR szFetCmd[] = L"ipconfig /all";
//网卡MAC地址的前导信息
const string str4Search = "Physical Address. . . . . . . . . : ";
char szBuffer[MAX_COMMAND_SIZE + 1] = { 0 }; // 放置命令行结果的输出缓冲区
string strBuffer;
unsigned long count = 0;
long ipos = 0;
BOOL bret = FALSE;
HANDLE hReadPipe = NULL; //读取管道
HANDLE hWritePipe = NULL; //写入管道
PROCESS_INFORMATION pi; //进程信息
STARTUPINFO si; //控制命令行窗口信息
SECURITY_ATTRIBUTES sa; //安全属性
memset(&pi, 0, sizeof(pi));
memset(&si, 0, sizeof(si));
memset(&sa, 0, sizeof(sa));
pi.hProcess = NULL;
pi.hThread = NULL;
si.cb = sizeof(STARTUPINFO);
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
//1.0 创建管道
bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
if (!bret){
goto END;
}
//2.0 设置命令行窗口的信息为指定的读写管道
GetStartupInfo(&si);
si.hStdError = hWritePipe;
si.hStdOutput = hWritePipe;
si.wShowWindow = SW_HIDE; //隐藏命令行窗口
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//3.0 创建获取命令行的进程
bret = CreateProcess(NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
if (!bret)
{
goto END;
}
//4.0 读取返回的数据
WaitForSingleObject(pi.hProcess, 500/*INFINITE*/);
bret = ReadFile(hReadPipe, szBuffer, MAX_COMMAND_SIZE, &count, 0);
if (!bret)
{
goto END;
}
printf("%s\n",szBuffer);
//5.0 提取MAC地址串
strBuffer.assign(szBuffer,szBuffer+count);
ipos = strBuffer.find(str4Search);
strBuffer = strBuffer.substr(ipos+str4Search.length());
ipos = strBuffer.find("\n");
strBuffer = strBuffer.substr(0, ipos);
strncpy(lpszString, strBuffer.c_str(), nMaxStringLen);
/*//6.0 去掉中间的“00-50-EB-0F-27-82”中间的'-'得到0050EB0F2782
int j = 0;
for(int i=0; i<strlen(szBuffer); i++)
{
if(szBuffer[i] != '-')
{
lpszString[j] = szBuffer[i];
j++;
}
}*/
END:
//关闭所有的句柄
CloseHandle(hWritePipe);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hReadPipe);
return bret;
}
方法2:GetAdaptersInfo
void PrintAllAdaptersInfo()
{
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
//得到结构体大小,用于GetAdaptersInfo参数
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
//记录网卡数量
int netCardNum = 0;
//记录每张网卡上的IP地址数量
int IPnumPerNetCard = 0;
if (ERROR_BUFFER_OVERFLOW == nRel)
{
//如果函数返回的是ERROR_BUFFER_OVERFLOW
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
//这也是说明为什么stSize既是一个输入量也是一个输出量
//释放原来的内存空间
delete pIpAdapterInfo;
//重新申请内存空间用来存储所有网卡信息
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);
}
if (ERROR_SUCCESS == nRel)
{
//输出网卡信息
//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
cout<<"网卡数量:"<<++netCardNum<<endl;
cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
switch(pIpAdapterInfo->Type)
{
case MIB_IF_TYPE_OTHER:
cout<<"网卡类型:"<<"OTHER"<<endl;
break;
case MIB_IF_TYPE_ETHERNET:
cout<<"网卡类型:"<<"ETHERNET"<<endl;
break;
case MIB_IF_TYPE_TOKENRING:
cout<<"网卡类型:"<<"TOKENRING"<<endl;
break;
case MIB_IF_TYPE_FDDI:
cout<<"网卡类型:"<<"FDDI"<<endl;
break;
case MIB_IF_TYPE_PPP:
printf("PP\n");
cout<<"网卡类型:"<<"PPP"<<endl;
break;
case MIB_IF_TYPE_LOOPBACK:
cout<<"网卡类型:"<<"LOOPBACK"<<endl;
break;
case MIB_IF_TYPE_SLIP:
cout<<"网卡类型:"<<"SLIP"<<endl;
break;
default:
break;
}
cout<<"网卡MAC地址:";
for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
if (i < pIpAdapterInfo->AddressLength-1)
{
printf("%02X-", pIpAdapterInfo->Address[i]);
}
else
{
printf("%02X\n", pIpAdapterInfo->Address[i]);
}
cout<<"网卡IP地址如下:"<<endl;
//可能网卡有多IP,因此通过循环去判断
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
do
{
cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
pIpAddrString=pIpAddrString->Next;
} while (pIpAddrString);
pIpAdapterInfo = pIpAdapterInfo->Next;
cout<<"--------------------------------------------------------------------"<<endl;
}
}
//释放内存空间
if (pIpAdapterInfo)
{
delete pIpAdapterInfo;
}
}
方法3:Netbios
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
} ASTAT, *PASTAT;
BOOL GetMacByNetbios(LPSTR lpszString, int nMaxStringLen)
{
BOOL bRet = FALSE;
ASTAT Adapter;
NCB Ncb;
UCHAR uRetCode;
LANA_ENUM lenum;
int i = 0;
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (UCHAR *)&lenum;
Ncb.ncb_length = sizeof(lenum);
uRetCode = Netbios( &Ncb );
//printf( "The NCBENUM return adapter number is: %d \n ", lenum.length);
for(i=0; i < lenum.length ; i++)
{
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = lenum.lana[i];
uRetCode = Netbios( &Ncb );
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = lenum.lana[i];
strcpy((char *)Ncb.ncb_callname, "* ");
Ncb.ncb_buffer = (unsigned char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &Ncb );
if (uRetCode == NRC_GOODRET )
{
printf("%02x-%02x-%02x-%02x-%02x-%02x ",
//_snprintf(lpszString, nMaxStringLen, "%02X-%02X-%02X-%02X-%02X-%02X",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5]
);
//printf( "The Ethernet Number on LANA %d is: %s\n ", lenum.lana[i], mac);
if(Adapter.adapt.adapter_type==0XFF)
printf("the adapter is token ring adapter.\n");
else if(Adapter.adapt.adapter_type==0XFE)
printf("the adapter is Ethernet adapter.\n");
else
printf("the adapter is %d.\n", Adapter.adapt.adapter_type);
bRet = TRUE;
//break;
}
}
return bRet;
}
//
//BOOL GetMacByNetbios2()
//{
// unsigned char MACData[8]; // 定义存放 MAC地址的缓冲区 (至少6字节)
// WKSTA_TRANSPORT_INFO_0 *pwkti;
// DWORD dwEntriesRead;
// DWORD dwTotalEntries;
// BYTE *pbBuffer;
//
// // 通过 NetBIOS的枚举函数获取MAC地址
// NET_API_STATUS dwStatus = NetWkstaTransportEnum(
// NULL, // [input] 服务器名,0指本机
// 0, // [input] 0指函数返回指向WKSTA_TRANSPORT_INFO_0结构的指针
// &pbBuffer, // [output] 指向缓冲区指针
// MAX_PREFERRED_LENGTH, // [input] 缓冲区最大长度
// &dwEntriesRead, // [output] 用于记录实际元素个数
// &dwTotalEntries, //
// NULL); //[input/output] 恢复句柄
// assert(dwStatus == NERR_Success);
// pwkti = (WKSTA_TRANSPORT_INFO_0 *)pbBuffer; // 指针类型转换
// for(DWORD i=0; i< dwEntriesRead; i++)
// { // 读取并打印MAC地址
// swscanf((wchar_t *)pwkti[i].wkti0_transport_address,
// L"%2hx%2hx%2hx%2hx%2hx%2hx",
// &MACData[0],
// &MACData[1],
// &MACData[2],
// &MACData[3],
// &MACData[4],
// &MACData[5]);
// PrintMACaddress(MACData);
// }
// // 释放缓冲区
// dwStatus = NetApiBufferFree(pbBuffer);
// assert(dwStatus == NERR_Success);
//}
方法4:GetIpAddrTable+SendARP
BOOL GetMacByIpTable(LPSTR lpszString, int nMaxStringLen)
{
BOOL bRet = FALSE;
int i,j;
MIB_IPADDRTABLE *pIPAddrTable;
DWORD dwSize = 0;
DWORD dwRetVal;
pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof(MIB_IPADDRTABLE) );
if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
free( pIPAddrTable );
pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
}
if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {
printf("GetIpAddrTable call failed with %d\n", dwRetVal);
bRet = FALSE;
}
for (i=0;i<pIPAddrTable->dwNumEntries;i++)
{
/*printf("IP Address: %ld\n", pIPAddrTable->table[i].dwAddr);
printf("IP Mask: %ld\n", pIPAddrTable->table[i].dwMask);
printf("IF Index: %ld\n", pIPAddrTable->table[i].dwIndex);
printf("Broadcast Addr: %ld\n", pIPAddrTable->table[i].dwBCastAddr);
printf("Re-assembly size: %ld\n", pIPAddrTable->table[i].dwReasmSize); */
ULONG ulHostIp = ntohl(pIPAddrTable->table[i].dwAddr);
ULONG ulHostMask = ntohl(pIPAddrTable->table[i].dwMask);
ULONG uNo = 0;
//for (j = 0; j < (~ulHostMask); j++)
{
IPAddr ipAddr;
ULONG pulMac[2];
ULONG ulLen;
ipAddr = pIPAddrTable->table[i].dwAddr;/*htonl(j+(ulHostIp&ulHostMask))*/;
memset(pulMac, 0xff, sizeof(pulMac));
ulLen = 6;
HRESULT hr = SendARP(ipAddr, 0, pulMac, &ulLen);
if (ulLen == 6)
{
uNo++;
PBYTE pbHexMac = (PBYTE)pulMac; //PBYTE:无符号单字节数值
unsigned char* strIpAddr = (unsigned char*)(&ipAddr);
//printf("%d\n", uNo);
printf("Mac_Address: %02X-%02X-%02X-%02X-%02X-%02X\n",
pbHexMac[0], pbHexMac[1], pbHexMac[2], pbHexMac[3], pbHexMac[4], pbHexMac[5]);
printf("IP_Address: %d.%d.%d.%d\n",
strIpAddr[0], strIpAddr[1], strIpAddr[2], strIpAddr[3]);
}
}
}
if (pIPAddrTable)
free(pIPAddrTable);
return bRet;
}
#define MACADDRESS_BYTELEN 6 // MAC地址字节长度
#define OID_802_3_PERMANENT_ADDRESS 0x01010101 //The address of the NIC encoded in the hardware.
//#define OID_802_3_CURRENT_ADDRESS 0x01010102 //The address the NIC is currently using.
/* An application can use IOCTL_NDIS_QUERY_GLOBAL_STATS to obtain information from a network adapter.
* The application passes IOCTL_NDIS_QUERY_GLOBAL_STATS, along with an Object Identifier(OID),
* in the DeviceIoControl() function.*/
#define IOCTL_NDIS_QUERY_GLOBAL_STATS 0x00170002
// 初始化网卡原始MAC地址的GUID结构
GUID GUID_DEVCLASS_QUERY={0xAD498944, 0x762F, 0x11D0, 0x8D, 0xCB, 0x00, 0xC0, 0x4F, 0xC3, 0x35, 0x8C};
BOOL GetMacByIOCTL()
{
HDEVINFO hDevInfo;
DWORD MemberIndex,RequiredSize;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
BOOL isOK=FALSE;
// 获取设备信息集
hDevInfo = SetupDiGetClassDevs( &GUID_DEVCLASS_QUERY, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE );
if( INVALID_HANDLE_VALUE == hDevInfo )
{
return FALSE;
}
// 枚举设备信息集中所有设备
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
/*台式机一般只有以太网卡,的以用"MemberIndex < 1"条件循环一次得到的便是以太网卡的地址,
而对笔记本来说,使用条件"MemberIndex < 2"可以得到两条信息,第一条信息是以太网卡的地址,
第二条信息是无线网卡的地址,可以设置参数来实现打印相应的网卡地址*/
for( MemberIndex = 0; MemberIndex < 10; MemberIndex++ )
{
// 获取设备接口
if( !SetupDiEnumDeviceInterfaces( hDevInfo, NULL, &GUID_DEVCLASS_QUERY, MemberIndex, &DeviceInterfaceData ) )
{
// 所有设备枚举完毕则进入此条语句,可以自行设置相应操作
break;
}
// 获取接收缓冲区大小,函数返回值为FALSE,GetLastError()=ERROR_INSUFFICIENT_BUFFER
SetupDiGetDeviceInterfaceDetail( hDevInfo, &DeviceInterfaceData, NULL, 0, &RequiredSize, NULL );
// 申请接收缓冲区
DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc( RequiredSize );
DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
// 获取设备细节信息
if( SetupDiGetDeviceInterfaceDetail( hDevInfo, &DeviceInterfaceData,
DeviceInterfaceDetailData, RequiredSize, NULL, NULL ) )
{
HANDLE hDeviceFile;
// 获取设备句柄
hDeviceFile = CreateFile(
DeviceInterfaceDetailData->DevicePath,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if( hDeviceFile != INVALID_HANDLE_VALUE )
{
ULONG dwID;
BYTE ucData[MACADDRESS_BYTELEN];
DWORD dwByteRet;
// 获取原生MAC地址
dwID = OID_802_3_PERMANENT_ADDRESS;
isOK = DeviceIoControl( hDeviceFile, IOCTL_NDIS_QUERY_GLOBAL_STATS, &dwID,
sizeof(dwID), ucData, sizeof(ucData), &dwByteRet, NULL );
if( isOK )
{
printf("%02X-%02X-%02X-%02X-%02X-%02X\n",
ucData[0],ucData[1],ucData[2],
ucData[3],ucData[4],ucData[5]);
} // if( isOK )
CloseHandle(hDeviceFile);
} // if( hDeviceFile != INVALID_HANDLE_VALUE )
} // if( SetupDiGetDeviceInterfaceDetail() )
free( DeviceInterfaceDetailData );
} // for( )
SetupDiDestroyDeviceInfoList( hDevInfo );
return TRUE;
}
BOOL GetMacByGUID()
{
unsigned char MACData[6];
UUID uuid;
UuidCreateSequential( &uuid ); // 要求操作系统创建一个新的UUID
for (int i=2; i<8; i++) // 获取本机MAC地址
MACData[i - 2] = uuid.Data4[i];
printf("MAC Address: %02X-%02X-%02X-%02X-%02X-%02X\n",
MACData[0], MACData[1], MACData[2], MACData[3], MACData[4], MACData[5]);
return TRUE;
}
方法7:SNMP
typedef BOOL(WINAPI * pSnmpExtensionInit) (
IN DWORD dwTimeZeroReference,
OUT HANDLE * hPollForTrapEvent,
OUT AsnObjectIdentifier * supportedView);
typedef BOOL(WINAPI * pSnmpExtensionTrap) (
OUT AsnObjectIdentifier * enterprise,
OUT AsnInteger * genericTrap,
OUT AsnInteger * specificTrap,
OUT AsnTimeticks * timeStamp,
OUT RFC1157VarBindList * variableBindings);
typedef BOOL(WINAPI * pSnmpExtensionQuery) (
IN BYTE requestType,
IN OUT RFC1157VarBindList * variableBindings,
OUT AsnInteger * errorStatus,
OUT AsnInteger * errorIndex);
typedef BOOL(WINAPI * pSnmpExtensionInitEx) (
OUT AsnObjectIdentifier * supportedView);
BOOL GetMacBySNMP()
{
HINSTANCE m_hInst;
pSnmpExtensionInit m_Init;
pSnmpExtensionInitEx m_InitEx;
pSnmpExtensionQuery m_Query;
pSnmpExtensionTrap m_Trap;
HANDLE PollForTrapEvent;
AsnObjectIdentifier SupportedView;
UINT OID_ifEntryType[] = {
1, 3, 6, 1, 2, 1, 2, 2, 1, 3
};
UINT OID_ifEntryNum[] = {
1, 3, 6, 1, 2, 1, 2, 1
};
UINT OID_ipMACEntAddr[] = {
1, 3, 6, 1, 2, 1, 2, 2, 1, 6
}; //, 1 ,6 };
AsnObjectIdentifier MIB_ifMACEntAddr =
{ sizeof(OID_ipMACEntAddr) / sizeof(UINT), OID_ipMACEntAddr };
AsnObjectIdentifier MIB_ifEntryType = {
sizeof(OID_ifEntryType) / sizeof(UINT), OID_ifEntryType
};
AsnObjectIdentifier MIB_ifEntryNum = {
sizeof(OID_ifEntryNum) / sizeof(UINT), OID_ifEntryNum
};
RFC1157VarBindList varBindList;
RFC1157VarBind varBind[2];
AsnInteger errorStatus;
AsnInteger errorIndex;
AsnObjectIdentifier MIB_NULL = {
0, 0
};
int ret;
int dtmp;
int i = 0, j = 0;
BOOL found = FALSE;
char temp[BUF_SIZE];
m_Init = NULL;
m_InitEx = NULL;
m_Query = NULL;
m_Trap = NULL;
/* Load the SNMP dll and get the addresses of the functions
necessary */
m_hInst = LoadLibrary(_T("inetmib1.dll"));
if (m_hInst < (HINSTANCE) HINSTANCE_ERROR) {
m_hInst = NULL;
return FALSE;
}
m_Init =
(pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
m_InitEx =
(pSnmpExtensionInitEx) GetProcAddress(m_hInst,
"SnmpExtensionInitEx");
m_Query =
(pSnmpExtensionQuery) GetProcAddress(m_hInst,
"SnmpExtensionQuery");
m_Trap =
(pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");
m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);
/* Initialize the variable list to be retrieved by m_Query */
varBindList.list = varBind;
varBind[0].name = MIB_NULL;
varBind[1].name = MIB_NULL;
/* Copy in the OID to find the number of entries in the
Inteface table */
varBindList.len = 1; /* Only retrieving one item */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
printf("# of adapters in this system : %i\n",
varBind[0].value.asnValue.number); varBindList.len = 2;
/* Copy in the OID of ifType, the type of interface */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);
/* Copy in the OID of ifPhysAddress, the address */
SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);
do {
/* Submit the query. Responses will be loaded into varBindList.
We can expect this call to succeed a # of times corresponding
to the # of adapters reported to be in the system */
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
if (!ret)
ret = 1;
else
/* Confirm that the proper type has been returned */
ret = SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType,
MIB_ifEntryType.idLength);
if (!ret) {
j++;
dtmp = varBind[0].value.asnValue.number;
printf("Interface #%i type : %i\n", j, dtmp);
/* Type 6 describes ethernet interfaces */
if (dtmp == 6) {
/* Confirm that we have an address here */
ret =
SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr,
MIB_ifMACEntAddr.idLength);
if ((!ret)
&& (varBind[1].value.asnValue.address.stream != NULL)) {
if (
(varBind[1].value.asnValue.address.stream[0] ==
0x44)
&& (varBind[1].value.asnValue.address.stream[1] ==
0x45)
&& (varBind[1].value.asnValue.address.stream[2] ==
0x53)
&& (varBind[1].value.asnValue.address.stream[3] ==
0x54)
&& (varBind[1].value.asnValue.address.stream[4] ==
0x00)) {
/* Ignore all dial-up networking adapters */
printf("Interface #%i is a DUN adapter\n", j);
continue;
}
if (
(varBind[1].value.asnValue.address.stream[0] ==
0x00)
&& (varBind[1].value.asnValue.address.stream[1] ==
0x00)
&& (varBind[1].value.asnValue.address.stream[2] ==
0x00)
&& (varBind[1].value.asnValue.address.stream[3] ==
0x00)
&& (varBind[1].value.asnValue.address.stream[4] ==
0x00)
&& (varBind[1].value.asnValue.address.stream[5] ==
0x00)) {
/* Ignore NULL addresses returned by other network
interfaces */
printf("Interface #%i is a NULL address\n", j);
continue;
}
sprintf(temp, "%02x-%02x-%02x-%02x-%02x-%02x",
varBind[1].value.asnValue.address.stream[0],
varBind[1].value.asnValue.address.stream[1],
varBind[1].value.asnValue.address.stream[2],
varBind[1].value.asnValue.address.stream[3],
varBind[1].value.asnValue.address.stream[4],
varBind[1].value.asnValue.address.stream[5]);
printf("MAC Address of interface #%i: %s\n", j,
temp);}
}
}
} while (!ret); /* Stop only on an error. An error will occur
when we go exhaust the list of interfaces to
be examined */
FreeLibrary(m_hInst);
/* 解除绑定 */
SNMP_FreeVarBind(&varBind[0]);
SNMP_FreeVarBind(&varBind[1]);
return FALSE;
}
具体例子工程请 下载http://download.csdn.net/detail/i7thtool/9658032