C/C++:Windows编程—代码获取本地所有网卡信息(网卡描述,IP地址,子网掩码,MAC地址)

时间:2024-04-06 09:54:54

先看效果

C/C++:Windows编程—代码获取本地所有网卡信息(网卡描述,IP地址,子网掩码,MAC地址)

看代码

使用 GetAdaptersInfo 函数获取网卡的所有信息。
MSDN函数说明 https://docs.microsoft.com/en-us/windows/desktop/api/iphlpapi/nf-iphlpapi-getadaptersinfo

#include <iostream>
#include <vector>
#include <WinSock2.h>
#include <Iphlpapi.h>
//#pragma comment(lib,"Iphlpapi.lib") //需要Iphlpapi.lib库 ,devc++中 项目 -> 项目选项-> 参数 -> 添加链接库 libiphlpapi.a (D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib\libiphlpapi.a) 
using namespace std;

static const  int ADAPTERNUM  = 10; 
void getAllAdapterInfo(){
	
	PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO[ADAPTERNUM];// 10个网卡空间 足够了 
	unsigned long stSize = sizeof(IP_ADAPTER_INFO) * ADAPTERNUM;
	// 获取所有网卡信息,参数二为输入输出参数 
	int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
	// 空间不足
	if (ERROR_BUFFER_OVERFLOW == nRel) {
		// 释放空间
		if(pIpAdapterInfo!=NULL)
			delete[] pIpAdapterInfo;
		return; 
	}
	
	PIP_ADAPTER_INFO cur =   pIpAdapterInfo;
	// 多个网卡 通过链表形式链接起来的 
	while(cur){
		cout<<"网卡描述:"<<cur->Description<<endl;
		switch (cur->Type) {
			case MIB_IF_TYPE_OTHER:
				break;
			case MIB_IF_TYPE_ETHERNET:
				{
					IP_ADDR_STRING *pIpAddrString =&(cur->IpAddressList);
					cout << "IP:" << pIpAddrString->IpAddress.String << endl;
					cout << "子网掩码:" << 	pIpAddrString->IpMask.String <<endl;
				}
				break;
			case MIB_IF_TYPE_TOKENRING:
				break;
			case MIB_IF_TYPE_FDDI:
				break;
			case MIB_IF_TYPE_PPP:
				break;
			case MIB_IF_TYPE_LOOPBACK:
				break;
			case MIB_IF_TYPE_SLIP:
				break;
			default://无线网卡,Unknown type
				{
					IP_ADDR_STRING *pIpAddrString =&(cur->IpAddressList);
					cout << "IP:" << pIpAddrString->IpAddress.String << endl;
					cout << "子网掩码:" << 	pIpAddrString->IpMask.String <<endl;
				}
				break;
		}
	    char hex[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'} ;
		
		// mac 地址一般6个字节 
		// mac 二进制转16进制字符串
		char macStr[18] = {0};//12+5+1
		int k = 0;
		for(int j = 0; j < cur->AddressLength; j++){
			macStr[k++] = hex[(cur->Address[j] & 0xf0) >> 4];
			macStr[k++] = hex[cur->Address[j] & 0x0f];
			macStr[k++] = '-'; 
		} 
		macStr[k-1] = 0;
		
		cout<<"MAC:" << macStr << endl; // mac地址 16进制字符串表示 
		cur = cur->Next;
		cout << "--------------------------------------------------" << endl;
	}
	
	// 释放空间
	if(pIpAdapterInfo!=NULL)
		delete[] pIpAdapterInfo;
} 
int main(int argc, char* argv[])
{
	getAllAdapterInfo();
	return 0;
}

项目工程

如果你的跑不起来,可以下载完整devc++的项目代码