在当今的网络化世界中,获取本机的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