C++實(shí)現(xiàn)獲取本機(jī)MAC地址與IP地址
實(shí)際工作中,項(xiàng)目上常常需要獲取本機(jī)的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;
}
// 分配網(wǎng)卡信息內(nèi)存
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地址是無法確認(rèn)使用的哪個
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();//獲取所有網(wǎng)卡信息
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(); //跳出外層循環(huán)
break;
}
}
}
return strMacAddr;
}
QString GetIP()
{
QString strIPAddr = "";
foreach (QHostAddress ptr , QNetworkInterface::allAddresses())
{
if(ptr.protocol() == QAbstractSocket::IPv4Protocol){// 獲取ipv4地址
if(!ptr.isLoopback()){ // 過濾本地回環(huán)127.0.0.1
strIPAddr = ptr.toString();
break;
}
}
}
return strIPAddr;
}
以上為VS和Qt中獲取本機(jī)IP和MAC的方法。
到此這篇關(guān)于C++實(shí)現(xiàn)獲取本機(jī)MAC地址與IP地址的文章就介紹到這了,更多相關(guān)C++獲取本機(jī)MAC地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV實(shí)現(xiàn)實(shí)時顏色檢測的示例
本文主要介紹了OpenCV實(shí)現(xiàn)實(shí)時顏色檢測的示例,通過HSV色彩空間轉(zhuǎn)換和色調(diào)范圍判斷實(shí)現(xiàn)紅黃綠藍(lán)顏色檢測,包含視頻捕捉、區(qū)域標(biāo)記、顏色分析等功能,具有一定的參考價值,感興趣的可以了解一下2025-06-06
C++利用opencv實(shí)現(xiàn)單目測距的實(shí)現(xiàn)示例
本文主要介紹了C++利用opencv實(shí)現(xiàn)單目測距的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
記逆向小白的第一次vbsedit 9爆破及內(nèi)存補(bǔ)丁制作過程
這篇文章主要介紹了記逆向小白的第一次vbsedit 9爆破及內(nèi)存補(bǔ)丁制作過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04

