C++实现获取IP、子网掩码、网关、DNS等本机网络参数的方法
本文以一个完整实例形式介绍了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; }