废话不多说了,直接上代码。
#include <IPHlpApi.h>
#pragma comment(lib,"IPHlpApi.lib")
typedef struct _NIC_Info
{
char AdapterName[260]; //网卡名称
char Description[132]; //网卡描述
char MacAddr[20]; //MAC地址
char IpAddress[16]; //IP地址
char IpMask[16]; //子网掩码
char GateAwayIpAddress[3][16]; //网关0, 网关1, 网关2
_NIC_Info()
{
memset(AdapterName, 0, 260);
memset(Description, 0, 132);
memset(MacAddr, 0, 20);
memset(IpAddress, 0, 16);
memset(IpMask, 0, 16);
memset(GateAwayIpAddress[0], 0, 16);
memset(GateAwayIpAddress[1], 0, 16);
memset(GateAwayIpAddress[2], 0, 16);
};
_NIC_Info& operator=(const _NIC_Info &Info)
{
if( this == &Info )
{ return *this; }
memcpy(this->AdapterName, Info.AdapterName, 260);
memcpy(this->Description, Info.Description, 132);
memcpy(this->MacAddr, Info.MacAddr, 20);
memcpy(this->IpAddress, Info.IpAddress, 16);
memcpy(this->IpMask, Info.IpMask, 16);
memcpy(this->GateAwayIpAddress[0], Info.GateAwayIpAddress[0], 16);
memcpy(this->GateAwayIpAddress[1], Info.GateAwayIpAddress[1], 16);
memcpy(this->GateAwayIpAddress[2], Info.GateAwayIpAddress[2], 16);
return *this; //注意返回类型
};
}*lpNIC_Info;
typedef CTypedPtrList<CPtrList ,lpNIC_Info> CNIC_Info_List;
BOOL GetLocalAdaptersInfo(CNIC_Info_List& List_NICInfo) //获取网卡信息 及 IP地址 列表
{
POSITION pos = List_NICInfo.GetHeadPosition();
while(pos)
{
lpNIC_Info pInfo = List_NICInfo.GetNext(pos);
if(NULL != pInfo)
{
delete pInfo;
pInfo = NULL;
}
}
List_NICInfo.RemoveAll();
//IP_ADAPTER_INFO结构体
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO;
if(NULL == pIpAdapterInfo)
{ return FALSE; }
//结构体大小
unsigned long ulSize = sizeof(IP_ADAPTER_INFO);
//获取适配器信息
int nRet = GetAdaptersInfo(pIpAdapterInfo, &ulSize);
if(ERROR_BUFFER_OVERFLOW == nRet)
{
//空间不足,删除之前分配的空间
delete[] pIpAdapterInfo;
//重新分配大小
pIpAdapterInfo = (PIP_ADAPTER_INFO) new BYTE[ulSize];
if(NULL == pIpAdapterInfo)
{ return FALSE; }
//获取适配器信息
nRet = GetAdaptersInfo(pIpAdapterInfo,&ulSize);
//获取失败
if(ERROR_SUCCESS != nRet)
{
if(pIpAdapterInfo != NULL)
{ delete []pIpAdapterInfo; }
return FALSE;
}
}
//赋值指针
BOOL bRet = TRUE;
PIP_ADAPTER_INFO pIterater = pIpAdapterInfo;
while(pIterater)
{
lpNIC_Info pNICInfo = new _NIC_Info;
if(NULL != pNICInfo)
{
memcpy(pNICInfo->AdapterName, pIterater->AdapterName, 260); //网卡名称
memcpy(pNICInfo->Description, pIterater->Description, 132); //网卡描述
//MAC地址
sprintf_s(pNICInfo->MacAddr,20,"%02X-%02X-%02X-%02X-%02X-%02X",
pIterater->Address[0], pIterater->Address[1], pIterater->Address[2],
pIterater->Address[3], pIterater->Address[4], pIterater->Address[5]);
//指向IP地址列表 (取首IP地址)
PIP_ADDR_STRING pIpAddr = &pIterater->IpAddressList;
while(pIpAddr)
{
memcpy(pNICInfo->IpAddress, pIpAddr->IpAddress.String, 16); //IP地址
memcpy(pNICInfo->IpMask, pIpAddr->IpMask.String, 16); //子网掩码
//指向网关列表 (取前三个网关)
PIP_ADDR_STRING pGateAwayList = &pIterater->GatewayList;
short i = 0;
while(pGateAwayList)
{
memcpy(pNICInfo->GateAwayIpAddress[i], pGateAwayList->IpAddress.String, 16); //网关
pGateAwayList = pGateAwayList->Next;
++i;
if(i > 2)
{ break; }
}
pIpAddr = pIpAddr->Next;
break; //跳出循环
}
List_NICInfo.AddTail(pNICInfo);
}
else
{ bRet = FALSE; }
pIterater = pIterater->Next;
}
//清理
if(pIpAdapterInfo)
{ delete []pIpAdapterInfo; }
return bRet;
}