实际工作中,项目上常常需要获取本机的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的方法。