在当今的网络化世界中,获取本机的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地址的具体实现方法,还能够深入理解这些关键信息在网络通信中的重要作用,为今后的开发工作奠定坚实的基础。
本文来源于#牵牛老人,由@蜜芽 整理发布。如若内容造成侵权/违法违规/事实不符,请联系本站客服处理!
该文章观点仅代表作者本人,不代表本站立场。本站不承担相关法律责任。
如若转载,请注明出处:https://www.zhanid.com/biancheng/3083.html




















