zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C++实现获取IP、子网掩码、网关、DNS等本机网络参数的方法

C++方法网络IP 实现 获取 参数 DNS
2023-06-13 09:15:39 时间

本文以一个完整实例形式介绍了C++实现获取IP、子网掩码、网关、DNS等本机网络参数的方法,供大家参考,具体的完整实例如下:

#pragmacomment(lib,"Ws2_32.lib")
#include<Iphlpapi.h>
#pragmacomment(lib,"Iphlpapi.lib")
usingnamespacestd;
typedefstructtagNetworkCfg
{
charszIP[18];
charszNetmask[18];
charszGateway[18];
charszDns1[18];
charszDns2[18];
}NetworkCfg;
boolGetNetworkCfg(NetworkCfg*cfg)
{
log_printf("Getnetworkconfig");
//获取网卡名称网卡名称,网卡别名
stringstrAdapterName,strAdapterAlias;
HKEYhKey,hSubKey,hNdiIntKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"System\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}",
0,
KEY_READ,
&hKey)!=ERROR_SUCCESS)
returnFALSE;

DWORDdwIndex=0;
DWORDdwBufSize=256;
DWORDdwDataType;
charszSubKey[256];
unsignedcharszData[256];

while(RegEnumKeyEx(hKey,dwIndex++,szSubKey,&dwBufSize,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
{
if(RegOpenKeyEx(hKey,szSubKey,0,KEY_READ,&hSubKey)==ERROR_SUCCESS)
{
if(RegOpenKeyEx(hSubKey,"Ndi\\Interfaces",0,KEY_READ,&hNdiIntKey)==ERROR_SUCCESS)
{
dwBufSize=256;
if(RegQueryValueEx(hNdiIntKey,"LowerRange",0,&dwDataType,szData,&dwBufSize)==ERROR_SUCCESS)
{
if(strstr((char*)szData,"ethernet")!=NULL)//判断是不是以太网卡
{
dwBufSize=256;
if(RegQueryValueEx(hSubKey,"DriverDesc",0,&dwDataType,szData,&dwBufSize)==ERROR_SUCCESS)
{
strAdapterName=(LPCTSTR)szData;
dwBufSize=256;
if(RegQueryValueEx(hSubKey,"NetCfgInstanceID",0,&dwDataType,szData,&dwBufSize)==ERROR_SUCCESS)
{
strAdapterAlias=(LPCTSTR)szData;
break;
}
}
}
}
RegCloseKey(hNdiIntKey);
}
RegCloseKey(hSubKey);
}

dwBufSize=256;
}/*endofwhile*/

RegCloseKey(hKey);
if(strAdapterName.empty()||strAdapterAlias.empty())
{
log_printf("failedtogetnetworkconfig");
returnfalse;
}
stringstrKeyName="SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
strKeyName+=strAdapterAlias;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
strKeyName.c_str(),
0,
KEY_READ,
&hKey)!=ERROR_SUCCESS)
returnFALSE;
dwBufSize=256;
if(RegQueryValueEx(hKey,"DhcpIPAddress",0,&dwDataType,szData,&dwBufSize)==ERROR_SUCCESS)
strcpy(cfg->szIP,(LPCTSTR)szData);
else{
if(RegQueryValueEx(hKey,"IPAddress",0,&dwDataType,szData,&dwBufSize)==ERROR_SUCCESS)
strcpy(cfg->szIP,(LPCTSTR)szData);
}

dwBufSize=256;
if(RegQueryValueEx(hKey,"DhcpSubnetMask",0,&dwDataType,szData,&dwBufSize)==ERROR_SUCCESS)
strcpy(cfg->szNetmask,(LPCTSTR)szData);
else
{
if(RegQueryValueEx(hKey,"SubnetMask",0,&dwDataType,szData,&dwBufSize)==ERROR_SUCCESS)
trcpy(cfg->szNetmask,(LPCTSTR)szData);
}

dwBufSize=256;
if(RegQueryValueEx(hKey,"DhcpDefaultGateway",0,&dwDataType,szData,&dwBufSize)==ERROR_SUCCESS)
strcpy(cfg->szGateway,(LPCTSTR)szData);
else
{
if(RegQueryValueEx(hKey,"DefaultGateway",0,&dwDataType,szData,&dwBufSize)==ERROR_SUCCESS)
strcpy(cfg->szGateway,(LPCSTR)szData);
}
RegCloseKey(hKey);

//获取DNS服务器信息
FIXED_INFO*fi=(FIXED_INFO*)GlobalAlloc(GPTR,sizeof(FIXED_INFO));
ULONGulOutBufLen=sizeof(FIXED_INFO);
DWORDret=::GetNetworkParams(fi,&ulOutBufLen);
if(ret!=ERROR_SUCCESS)
{
GlobalFree(fi);
fi=(FIXED_INFO*)GlobalAlloc(GPTR,ulOutBufLen);
ret=::GetNetworkParams(fi,&ulOutBufLen);
if(ret!=ERROR_SUCCESS)
{
log_printf("GetDnsserverfailed");
returnfalse;
}
}
strcpy(cfg->szDns1,fi->DnsServerList.IpAddress.String);
IP_ADDR_STRING*pIPAddr=fi->DnsServerList.Next;
if(pIPAddr!=NULL)
strcpy(cfg->szDns2,pIPAddr->IpAddress.String);
returnfalse;
}