• C++ 获取网卡名称和IP地址


    描述

    这是获取网卡名称和IP地址的代码示例,参考自http://t.csdn.cn/h1u6S。原文描述得比较详细,感谢博主分享。原文代码中没有输出网卡的物理地址,下面的代码进行了补充,并在win10上运行正常。

    代码

    //http://t.csdn.cn/h1u6S
    #include 
    #include 
    #pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
    #include 
    #include 
    #include 
    #include 
    #include 
    #include   
    #include   
    #include 
    void GetAdapters()
    {
    	//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)
    		{
    			std::cout << "网卡名称:" << pIpAdapterInfo->AdapterName << std::endl;
    			std::cout << "网卡描述:" << pIpAdapterInfo->Description << std::endl;
    
    			std::string mac = "";
    			for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
    			{
    				std::stringstream ss;
    				ss << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(pIpAdapterInfo->Address[i]);
    				std::string hex = ss.str();
    				if (i != pIpAdapterInfo->AddressLength - 1)
    					mac += hex + "-";
    				else
    					mac += hex;
    			}
    			std::cout << "物理地址:" << mac << std::endl;
    
    			IP_ADDR_STRING* pIpAddrString = &(pIpAdapterInfo->IpAddressList);
    			int IPnumPerNetCard = 0;
    			do
    			{
    				std::cout << "该网卡上的IP数量:" << ++IPnumPerNetCard << std::endl;
    				std::cout << "IP 地址:" << pIpAddrString->IpAddress.String << std::endl;
    				std::cout << "子网地址:" << pIpAddrString->IpMask.String << std::endl;
    				std::cout << "网关地址:" << pIpAdapterInfo->GatewayList.IpAddress.String << std::endl;
    				std::cout << "--------------------------" << std::endl;
    				pIpAddrString = pIpAddrString->Next;
    			} while (pIpAddrString);
    			pIpAdapterInfo = pIpAdapterInfo->Next;
    		}
    	}
    	//释放内存空间
    	if (pIpAdapterInfo)
    	{
    		delete pIpAdapterInfo;
    	}
    	return;
    }
    
    int main(int argc, char** argv)
    {
    	GetAdapters();
    	std::cin.get();
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    输出:
    网卡名称:{C2A423B8-EC5F-4681-8B5F-BD75FB715AE2}
    网卡描述:Intel® Ethernet Connection (14) I219-LM
    物理地址:00-BE-43-94-6A-66
    该网卡上的IP数量:1
    IP 地址:192.168.16.71
    子网地址:255.255.255.0
    网关地址:192.168.16.1
    --------------------------
    网卡名称:{4D5CF880-A1D3-4677-91AD-BD39B2E6DDE6}
    网卡描述:VMware Virtual Ethernet Adapter for VMnet1
    物理地址:00-50-54-C0-00-01
    该网卡上的IP数量:1
    IP 地址:192.168.23.1
    子网地址:255.255.255.0
    网关地址:0.0.0.0
    --------------------------
    网卡名称:{C783E463-B6B0-4F96-BA40-2C1DE1C07233}
    网卡描述:VMware Virtual Ethernet Adapter for VMnet8
    物理地址:00-50-54-C0-00-08
    该网卡上的IP数量:1
    IP 地址:192.168.133.5
    子网地址:255.255.255.0
    网关地址:0.0.0.0
    --------------------------
    网卡名称:{2887353F-2A70-45F6-8A78-22C95D229EF0}
    网卡描述:Bluetooth Device (Personal Area Network) #2
    物理地址:04-7F-0E-37-0A-1D
    该网卡上的IP数量:1
    IP 地址:0.0.0.0
    子网地址:0.0.0.0
    网关地址:0.0.0.0

  • 相关阅读:
    准备有空开发一个管理端代码生成器
    基于SSM+Vue的亿互游在线平台的设计与开发
    PySpark
    SpringCloud之Sentinel
    使用SpringBoot Actuator监控应用
    「随笔」IT行业哪个方向比较好就业
    PDF文件如何编辑?这两种方法是我一直在用的
    RabbitMQ 使用细节 → 优先级队列与ACK超时
    Shiro实现多realm方案
    Flutter 自签名证书
  • 原文地址:https://blog.csdn.net/WangPaiFeiXingYuan/article/details/133383194