获取MAC地址大全

130 篇文章 1 订阅
85 篇文章 0 订阅

获取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;
}


方法5:IOCTL SetupDiGetClassDevs SetupDiEnumDeviceInterfaces SetupDiGetDeviceInterfaceDetail

#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;
} 


方法6:GUID UUID

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




  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值