C++实现获取本机MAC地址和IP地址的方法

牵牛老人 2025-02-07 15:57:23编程技术
184

在当今的网络化世界中,获取本机的MAC地址和IP地址对于网络编程、系统管理和安全监控等领域至关重要。MAC地址作为网络设备的唯一物理标识,对于网络设备的识别和管理具有不可替代的作用。而IP地址则是设备在网络中进行通信的基础,无论是局域网内的设备互联还是跨网络的远程访问,都离不开IP地址的支持。因此,掌握在编程中如何获取这些关键信息,对于开发人员和系统管理员来说是一项必备技能。本文将介绍一种在C++环境下实现获取本机MAC地址和IP地址的方法,通过详细的代码示例和解析,帮助读者理解并掌握这一实用技术。

实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取

1.MFC中获取IP和MAC地址

获取IP需要添加"WS2_32.lib"库

话不多说代码如下

//获取MAC地址
std::string OnGetLocalMac()
{
	string*   pstrMacs;
	std::string strMac;
	int nMacCount;
	PIP_ADAPTER_INFO pAdapterInfo;  
	PIP_ADAPTER_INFO pAdapterInfo1 = NULL; 
	DWORD AdapterInfoSize;  
	char szMac[33]   =   {0}; 
	DWORD Err;    
	AdapterInfoSize = 0;  
	Err = GetAdaptersInfo(NULL, &AdapterInfoSize);  
	if((Err   !=   0)   &&   (Err   !=   ERROR_BUFFER_OVERFLOW))
	{
		goto err;
	}  
	//   分配网卡信息内存  
	pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, AdapterInfoSize);  
	if(pAdapterInfo == NULL)
	{
		goto err;
	}    
	if(GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize) != 0)
	{  
		GlobalFree(pAdapterInfo);
		goto err;
	}   
	pAdapterInfo1 = pAdapterInfo;
	nMacCount = 0;
	while(pAdapterInfo1)
	{
		nMacCount++;
		pAdapterInfo1= pAdapterInfo1->Next;
	}
	if(nMacCount <= 0)
	{
		GlobalFree(pAdapterInfo);
		goto err;
	}
	pstrMacs = new string[nMacCount];
	pAdapterInfo1 = pAdapterInfo;
	for (int i = 0; i < nMacCount; i++)
	{
		memset(szMac, 0, sizeof(szMac));
		sprintf_s(szMac, 
			32, 
			"%02X:%02X:%02X:%02X:%02X:%02X",
			pAdapterInfo1->Address[0],  
			pAdapterInfo1->Address[1],  
			pAdapterInfo1->Address[2],  
			pAdapterInfo1->Address[3],  
			pAdapterInfo1->Address[4],  
			pAdapterInfo1->Address[5]);
		_strupr_s(szMac,32);
		pstrMacs[i] = szMac;
		pAdapterInfo1 = pAdapterInfo1->Next;
	}
	GlobalFree(pAdapterInfo); 

err:
	//这里只取第一个地址,多个MAC地址是无法确认使用的哪个
	strMac = pstrMacs[0];
	return strMac ;
}

//获取IP地址
#pragma comment(lib, "WS2_32.lib")
std::string OnGetLocalIP()
{

	long lRet = 0;
	char szHostName[256] = {0};
	long lHostNameLen = 256;
	int nRet = 0;
	hostent *phost = NULL;
	std::string strHostIp = "";

//这种方式获取不到,改用下面的方式
	//for(int i=0;phost!=NULL&&phost->h_addr_list[i]!=NULL;i++)  
	//{  
	//	char* pszHostIP=inet_ntoa(*(struct in_addr*)phost->h_addr_list[i]);  
	//	strHostIp=pszHostIP;  
	//}
	//通过下面的gethostname获取
	WSADATA WSAData;
	if (!WSAStartup(MAKEWORD(2, 0),&WSAData))
	{  
		if(!gethostname(szHostName,sizeof(szHostName)))
		{
			hostent *host=gethostbyname(szHostName);
			if(host!=NULL)
			{
				char* pszHostIP =  inet_ntoa(*(struct in_addr*)*host->h_addr_list);
				strHostIp = pszHostIP;

			}
		}
	}
	return strHostIp;
	
}

2.以上是VS C++中常用的获取方式,如果使用Qt,可以用Qt的库获取的就更为简单

//需要添加头文件
#include <QNetworkInterface>
QString GetMac()
{
    QString strMacAddr = "";
    QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces();//获取所有网卡信息
    for (int i = 0; i < ifaces.count(); i++)
    {
        QNetworkInterface iface = ifaces.at(i);
        if ( iface.flags().testFlag(QNetworkInterface::IsUp) && iface.flags().testFlag(QNetworkInterface::IsRunning) && !iface.flags().testFlag(QNetworkInterface::IsLoopBack))
        {
            for (int j=0; j<iface.addressEntries().count(); j++)
            {
                strMacAddr = iface.hardwareAddress();
                i = ifaces.count(); //跳出外层循环
                break;
            }
        }
    }

    return strMacAddr;
}

QString GetIP()
{
    QString strIPAddr = "";
    foreach (QHostAddress ptr , QNetworkInterface::allAddresses())
    {
        if(ptr.protocol() == QAbstractSocket::IPv4Protocol){// 获取ipv4地址
            if(!ptr.isLoopback()){  // 过滤本地回环127.0.0.1
                strIPAddr = ptr.toString();
                break;
            }
        }
    }
    return strIPAddr;
}

以上为VS和Qt中获取本机IP和MAC的方法。

总结

本文详细介绍了在C++环境下获取本机MAC地址和IP地址的方法。通过调用Windows API函数GetAdaptersInfo,我们成功获取了网络接口的信息,并从中提取出了MAC地址。同时,利用WSAStartup、gethostname和gethostbyname等函数,我们也实现了对本机IP地址的获取。这些方法不仅适用于Windows操作系统,而且为网络编程、系统管理和安全监控等领域提供了有力的支持。通过本文的学习,读者不仅能够掌握获取MAC地址和IP地址的具体实现方法,还能够深入理解这些关键信息在网络通信中的重要作用,为今后的开发工作奠定坚实的基础。

c++ mac地址 ip地址
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

C++ 中 format 和 vformat 函数的使用示例与详细解析
在C++编程中,字符串格式化是一项常见且重要的操作。C++11虽然引入了新的C风格字符串格式化函数,但类型安全问题依旧存在。直到C++20标准的发布,引入了format和vformat函数,...
2025-02-17 编程技术
142

Visual Studio Code(VSCode)中配置 C++ 开发环境的详细教程
随着编程语言和开发工具的不断更新,选择一款高效、易用的开发环境变得尤为重要。Visual Studio Code(简称VSCode)作为一款轻量级但功能强大的代码编辑器,受到了广大开发者的...
2025-01-06 编程技术
202

C++函数模板(Template)基础知识讲解
在C++编程中,函数模板(Template)提供了一种强大的工具,使得程序员能够编写出通用的函数代码,从而避免了重复定义相同逻辑的函数。函数模板不仅提高了代码的复用性,还增强了...
2024-12-20 编程技术
211

C++ Vector 容器常见用法详解:从基础到高级
在现代编程中,容器是不可或缺的一部分,它们使得数据的存储、管理和操作变得更加高效和便捷。C++中的Vector容器作为标准模板库(STL)的一部分,因其动态数组的特性而广受欢...
2024-12-20 编程技术
228

C++使用BitBlt函数进行窗口抓图的示例代码
在Windows编程中,捕获屏幕或特定窗口的内容是一个常见的需求。C++ 提供了多种方法来实现这一功能,其中 BitBlt 函数是一个非常实用的选择。BitBlt 函数可以将一个设备上下文...
2024-12-19 编程技术
229

C++11中std::bind使用方法详解
C++11引入了许多新特性,其中std::bind是一个非常有用的工具,它可以将函数对象与其参数绑定在一起,形成一个新的可调用对象。这在回调函数、事件处理和函数组合等场景中非常...
2024-12-18 编程技术
242