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; }
相关文章
- C++泛型编程,模板(二)类模板
- EasyC++09,C++中的数组
- web后端语言_C/C++作为web后端语言的缺点
- C++ 新增的 stl 容器实用方法,你知道几个?(文末赠送 C++20 书籍)
- C++stl库_c++库
- 在 Cu002FC++ 中反转字符串的不同方法
- C/C++ 实现简易特征码扫描器
- 如何进行C++动态转换
- 【C++】C++入门
- C++ list(STL list)访问(获取)元素方法详解
- C++ string类成员函数汇总(超全)
- 基于C++map中key使用指针问题的详解
- c++实现strcat字符串连接库函数的方法详解
- C++调试追踪class成员变量的方法
- C与C++之间相互调用实例方法讲解
- C/C++判断传入的UTC时间是否当天的实现方法
- C++操作MySQL大量数据插入效率低下的解决方法
- VC++实现程序开机启动运行的方法
- C++实现将一个字符串中的字符替换成另一个字符串的方法