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: //這里只取第一個(gè)地址,多個(gè)MAC地址是無法確認(rèn)使用的哪個(gè) 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的庫獲取的就更為簡(jiǎn)單
//需要添加頭文件 #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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何在Qt中實(shí)現(xiàn)關(guān)于Json?的操作
JSON是一種輕量級(jí)數(shù)據(jù)交換格式,常用于客戶端和服務(wù)端的數(shù)據(jù)交互,不依賴于編程語言,在很多編程語言中都可以使用JSON,這篇文章主要介紹了在Qt中實(shí)現(xiàn)關(guān)于Json的操作,需要的朋友可以參考下2023-08-08C語言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實(shí)現(xiàn)并分析
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實(shí)現(xiàn)并分析的相關(guān)資料,需要的朋友可以參考下2017-03-03使用C語言實(shí)例描述程序中的內(nèi)聚和耦合問題
這篇文章主要介紹了用C語言實(shí)例描述程序中的內(nèi)聚和耦合,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08C語言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語言實(shí)現(xiàn)帶頭結(jié)點(diǎn)的鏈表的創(chuàng)建、查找、插入、刪除操作
這篇文章主要介紹了C語言實(shí)現(xiàn)帶頭結(jié)點(diǎn)的鏈表的創(chuàng)建、查找、插入、刪除操作方法,對(duì)于了解數(shù)據(jù)結(jié)構(gòu)中鏈表的各項(xiàng)操作有很好的借鑒價(jià)值,需要的朋友可以參考下2014-09-09C語言動(dòng)態(tài)內(nèi)存的分配最全面分析
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語言中動(dòng)態(tài)內(nèi)存的管理2022-08-08