ipconfig的C语言实现
首先,这篇文章实现了两种方法查询IP,实现截图如下:
第一种方法时调用系统命令,代码如下:
#include <cstdlib>#include <iostream>using namespace std;int main(int argc, char *argv[]){ system("ipconfig"); system("PAUSE"); return EXIT_SUCCESS;}
下面这种方法是对源码的解析:
#include <windows.h>#include <IPHlpApi.h>#include <stdio.h>#include <time.h>#include<Ipexport.h>#include<Windns.h>#pragma comment(lib,"Ws2_32")#pragma comment(lib,"Dnsapi")#define Max 10 ;//#include <winsock2.h>#pragma comment(lib,"IPHlpApi")void DoUsage(bool);void DoRelease(bool);// realizedvoid DoRenew(bool);//realizedvoid DoDisplayDns(bool);void DoFlushDns(bool);void DoAll(void);void GetInterfaceInfo(void);//LPCTSTR GetNodeTypeName(UINT nodeType);//LPCTSTR GetInterfaceTypeName(UINT InterfaceType); IP_ADAPTER_INDEX_MAP adapterInfo; PIP_INTERFACE_INFO pInfo;DWORD checkReturn;void main(int argc,char **argv){bool doUsage=false;bool doAll=false;bool doRelease=false;bool doRenew=false;bool doDisplayDns=false;bool doFlushDns=false;char *argument; //store the command line codeargument=&argv[1][1];if((argc>1)&&(argv[1][0]=='/')){ if(!strcmp(argument,"?")) { doUsage=true; DoUsage(doUsage); } if(!strcmp(argument,"all")) { doUsage=true; DoAll(); } if(!strcmp(argument,"release")) { doRelease=true; DoRelease(doRelease); } if(!strcmp(argument,"renew")) { doRenew=true; DoRenew(doRenew); } if(!strcmp(argument,"displaydns")) { doDisplayDns=true; DoDisplayDns(doDisplayDns); } if(!strcmp(argument,"flushdns")) { doFlushDns=true; DoFlushDns(doFlushDns); }}elseprintf("error command code!");printf("......................................");}/* get the using adapter information*/void GetInterfaceInfo(){ ULONG outBufferLen=0; pInfo=(IP_INTERFACE_INFO *)malloc(sizeof(IP_INTERFACE_INFO));/* Make the first call to buffer information*/ if((checkReturn=GetInterfaceInfo(pInfo,&outBufferLen))==ERROR_INSUFFICIENT_BUFFER) { free(pInfo); pInfo=(IP_INTERFACE_INFO *)malloc(outBufferLen); }/* Make the second call of GetInterfaceInfo() to get the actual data */ if((checkReturn=GetInterfaceInfo(pInfo,&outBufferLen))==NO_ERROR) { adapterInfo=pInfo->Adapter[0];//关键此处返回IP_ADAPTER_INDEX_MAP 用于IP更新 printf("the dapter name is: %d ",pInfo->Adapter[0].Name); } else { printf("Get the interface information occer error!"); }}/* release IP address */void DoRelease(bool doRelease){ if(doRelease) { GetInterfaceInfo();/**the specific action to config/release*/ if((checkReturn=IpReleaseAddress(&adapterInfo))==NO_ERROR) { printf("the action of release IP work!"); } else printf("An error occured while releasing interface of %s",pInfo->Adapter[0].Name);} else { printf("illegal action"); }}/** Do renew IPAddree */void DoRenew(bool doRenew){ if(doRenew) { GetInterfaceInfo(); if((checkReturn=IpRenewAddress(&adapterInfo))==NO_ERROR) { printf("the action of release IP work!"); } else printf("An error occured while releasing interface of %s",pInfo->Adapter[0].Name); } else { printf("illegal action"); }}/* display all information ipconfig/all */void DoAll(void){ DWORD returnCheckError; PFIXED_INFO pFixedInfo; DWORD FixedInfoSize = 0; PIP_ADDR_STRING pAddrStr; PIP_ADAPTER_INFO pAdapt,pAdapterInfo; if ((returnCheckError = GetNetworkParams(NULL, &FixedInfoSize)) != 0) { if (returnCheckError != ERROR_BUFFER_OVERFLOW) { printf("GetNetworkParams sizing failed with error %d\n", returnCheckError); return; } } // Allocate memory from sizing information if ((pFixedInfo = (PFIXED_INFO) malloc( FixedInfoSize)) == NULL) { printf("Memory allocation error\n"); return; } if ((returnCheckError = GetNetworkParams(pFixedInfo, &FixedInfoSize)) == 0) { printf("\tHost Name . . . . . . . . . : %s\n", pFixedInfo->HostName); printf("\tDNS Servers . . . . . . . . : %s\n", pFixedInfo->DnsServerList.IpAddress.String); pAddrStr = pFixedInfo->DnsServerList.Next; while(pAddrStr) { printf("%52s\n", pAddrStr->IpAddress.String); pAddrStr = pAddrStr->Next; } printf("\tNode Type . . . . . . . . . : "); switch (pFixedInfo->NodeType) { case 1: printf("%s\n", "Broadcast"); break; case 2: printf("%s\n", "Peer to peer"); break; case 4: printf("%s\n", "Mixed"); break; case 8: printf("%s\n", "Hybrid"); break; default: printf("\n"); } printf("\tNetBIOS Scope ID. . . . . . : %s\n", pFixedInfo->ScopeId); printf("\tIP Routing Enabled. . . . . : %s\n", (pFixedInfo->EnableRouting ? "yes" : "no")); printf("\tWINS Proxy Enabled. . . . . : %s\n", (pFixedInfo->EnableProxy ? "yes" : "no")); printf("\tNetBIOS Resolution Uses DNS : %s\n", (pFixedInfo->EnableDns ? "yes" : "no")); } else { printf("GetNetworkParams failed with error %d\n", returnCheckError); return; } // // Enumerate all of the adapter specific information using the IP_ADAPTER_INFO structure. // Note: IP_ADAPTER_INFO contains a linked list of adapter entries. ULONG AdapterInfoSize = 0; if ((returnCheckError = GetAdaptersInfo(NULL, &AdapterInfoSize)) != 0) { if (returnCheckError != ERROR_BUFFER_OVERFLOW) { printf("GetAdaptersInfo sizing failed with error %d\n", returnCheckError); return; } } // Allocate memory from sizing information if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize)) == NULL) { printf("Memory allocation error\n"); return; } // Get actual adapter information if ((returnCheckError = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0) { printf("GetAdaptersInfo failed with error %d\n", returnCheckError); return; } pAdapt = pAdapterInfo; while (pAdapt) { switch (pAdapt->Type) { case MIB_IF_TYPE_ETHERNET: printf("\nEthernet adapter "); break; case MIB_IF_TYPE_TOKENRING: printf("\nToken Ring adapter "); break; case MIB_IF_TYPE_FDDI: printf("\nFDDI adapter "); break; case MIB_IF_TYPE_PPP: printf("\nPPP adapter "); break; case MIB_IF_TYPE_LOOPBACK: printf("\nLoopback adapter "); break; case MIB_IF_TYPE_SLIP: printf("\nSlip adapter "); break; case MIB_IF_TYPE_OTHER: default: printf("\nOther adapter "); } printf("%s:\n\n", pAdapt->AdapterName); printf("\tDescription . . . . . . . . : %s\n", pAdapt->Description); printf("\tPhysical Address. . . . . . : "); for (UINT i=0; i<pAdapt->AddressLength; i++) { if (i == (pAdapt->AddressLength - 1)) printf("%.2X\n",(int)pAdapt->Address[i]); else printf("%.2X-",(int)pAdapt->Address[i]); } printf("\tDHCP Enabled. . . . . . . . : %s\n", (pAdapt->DhcpEnabled ? "yes" : "no")); pAddrStr = &(pAdapt->IpAddressList); while(pAddrStr) { printf("\tIP Address. . . . . . . . . : %s\n", pAddrStr->IpAddress.String); printf("\tSubnet Mask . . . . . . . . : %s\n", pAddrStr->IpMask.String); pAddrStr = pAddrStr->Next; } printf("\tDefault Gateway . . . . . . : %s\n", pAdapt->GatewayList.IpAddress.String); pAddrStr = pAdapt->GatewayList.Next; while(pAddrStr) { printf("%52s\n", pAddrStr->IpAddress.String); pAddrStr = pAddrStr->Next; } printf("\tDHCP Server . . . . . . . . : %s\n", pAdapt->DhcpServer.IpAddress.String); printf("\tPrimary WINS Server . . . . : %s\n", pAdapt->PrimaryWinsServer.IpAddress.String); printf("\tSecondary WINS Server . . . : %s\n", pAdapt->SecondaryWinsServer.IpAddress.String); struct tm *newtime; // Display coordinated universal time - GMT newtime = gmtime(&pAdapt->LeaseObtained); printf( "\tLease Obtained. . . . . . . : %s", asctime( newtime ) ); newtime = gmtime(&pAdapt->LeaseExpires); printf( "\tLease Expires . . . . . . . : %s", asctime( newtime ) ); pAdapt = pAdapt->Next; }}void DoUsage(bool doUsage){ if(doUsage) { printf("\nUSAGE:\n" " ipconfig [/? | /all | /renew [adapter] | /release [adapter] |\n" " /flushdns | /displaydns | /registerdns |\n" " /showclassid adapter |\n" " /setclassid adapter [classid] ]\n" "\n" "where\n" " adapter Connection name\n" " (wildcard characters * and ? allowed, see examples)\n" "\n" " Options:\n" " /? Display this help message\n" " /all Display full configuration information.\n" " /release Release the IP address for the specified adapter.\n" " /renew Renew the IP address for the specified adapter.\n" " /flushdns Purges the DNS Resolver cache.\n" " /registerdns Refreshes all DHCP leases and re-registers DNS names.\n" " /displaydns Display the contents of the DNS Resolver Cache.\n" " /showclassid Displays all the dhcp class IDs allowed for adapter.\n" " /setclassid Modifies the dhcp class id.\n" "\n" "The default is to display only the IP address, subnet mask and\n" "default gateway for each adapter bound to TCP/IP.\n" "\n" "For Release and Renew, if no adapter name is specified, then the IP address\n" "leases for all adapters bound to TCP/IP will be released or renewed.\n" "\n" "For Setclassid, if no ClassId is specified, then the ClassId is removed.\n" "\n" "Examples:\n" " > ipconfig ... Show information.\n" " > ipconfig /all ... Show detailed information\n" " > ipconfig /renew ... renew all adapters\n" " > ipconfig /renew EL* ... renew any connection that has its\n" " name starting with EL\n" " > ipconfig /release *Con* ... release all matching connections,\n" " eg. \"Local Area Connection 1\" or\n" " \"Local Area Connection 2\"\n"); } else { printf("ilegal code!"); }}void DoDisplayDns(bool doDisplayDns){if(doDisplayDns){ char hostname[256]; int iRet = 0; WSADATA wsaData; DNS_STATUS status; //Return value of DnsQuery_A() function. PDNS_RECORD pDnsRecord; int assignBuffLenght; assignBuffLenght=(sizeof(DNS_RECORD))*Max; pDnsRecord=(DNS_RECORD*)malloc(assignBuffLenght); memset(pDnsRecord,0,assignBuffLenght); if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL { printf("Winsock无法初始化!\n"); WSACleanup(); } memset(hostname, 0, 256); iRet = gethostname(hostname, sizeof(hostname)); if(iRet != 0 ) { printf( "get hostname error:%d\n", iRet); } printf("%s\n", hostname); LPSTR pOwnerName=hostname; // Calling function DnsQuery to query Host or PTR records status = DnsQuery(pOwnerName, //Pointer to OwnerName. DNS_TYPE_A, //Type of the record to be queried. DNS_QUERY_STANDARD, // Bypasses the resolver cache on the lookup. NULL, //Contains DNS server IP address. &pDnsRecord, //Resource record that contains the response. NULL); //Reserved for future use. // printf("The host name is %s \n",(pDnsRecord->Data.PTR.pNameHost)); while(pDnsRecord){ printf("The host name is %s \n",pDnsRecord->pName); printf("the type is %d \n",pDnsRecord->wType); printf("the lenght of data is %d \n", pDnsRecord->wDataLength); printf(" the time to live is %d \n", pDnsRecord-> dwTtl); printf("the lenght of data id %d \n", pDnsRecord-> dwReserved); pDnsRecord=pDnsRecord->pNext; } printf("dnsCache print over");}else{printf("ilegal code");}}void DoFlushDns(bool){printf("relizing config/flushdns!");}
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.****.net/jiangjunshow