基本信息
源码名称:c++ ipconfig源码(获取ip/dns/网关等信息)
源码大小:3.12M
文件格式:.zip
开发语言:C/C++
更新时间:2018-05-06
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <tchar.h> #include <string.h> #include <ctype.h> #include <winsock2.h> #include "iphlpapi.h" #pragma comment(lib,"Iphlpapi.lib") #include <mprapi.h> #pragma comment(lib,"Mprapi.lib") #define UNICODE #define _UNICODE LPCTSTR GetNodeTypeName(UINT NodeType) { switch (NodeType) { case 1: return _T("Broadcast"); case 2: return _T("Peer To Peer"); case 4: return _T("Mixed"); case 8: return _T("Hybrid"); default : return _T("unknown"); } } LPCTSTR GetInterfaceTypeName(UINT InterfaceType) { switch (InterfaceType) { case MIB_IF_TYPE_OTHER: return _T("Other Type Of Adapter"); case MIB_IF_TYPE_ETHERNET: return _T("Ethernet Adapter"); case MIB_IF_TYPE_TOKENRING: return _T("Token Ring Adapter"); case MIB_IF_TYPE_FDDI: return _T("FDDI Adapter"); case MIB_IF_TYPE_PPP: return _T("PPP Adapter"); case MIB_IF_TYPE_LOOPBACK: return _T("Loopback Adapter"); case MIB_IF_TYPE_SLIP: return _T("SLIP Adapter"); default: return _T("unknown"); } } /* print MAC address */ PTCHAR PrintMacAddr(PBYTE Mac) { static TCHAR MacAddr[20]; _stprintf(MacAddr, _T("%02x-%02x-%02x-%02x-%02x-%02x"), Mac[0], Mac[1], Mac[2], Mac[3], Mac[4], Mac[5]); return MacAddr; } DWORD DoFormatMessage(DWORD ErrorCode) { LPVOID lpMsgBuf; DWORD RetVal; if ((RetVal = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ (LPTSTR) &lpMsgBuf, 0, NULL ))) { _tprintf(_T("%s"), (LPTSTR)lpMsgBuf); LocalFree(lpMsgBuf); /* return number of TCHAR's stored in output buffer * excluding '\0' - as FormatMessage does*/ return RetVal; } else return 0; } // 获取当前活动适配器名称 LPCTSTR GetAdapterName(int nIndex) { HANDLE hMprConfig; DWORD dwRet=0; PIP_INTERFACE_INFO plfTable=NULL; IP_ADAPTER_INDEX_MAP AdaptMap; DWORD dwBufferSize=0; char szName[256] = {0}; int nLen =0; UINT i = 0; TCHAR szFriendName[256]; DWORD tchSize=sizeof(TCHAR)*256; ZeroMemory(&szFriendName,tchSize); dwRet=MprConfigServerConnect (NULL,&hMprConfig); dwRet=GetInterfaceInfo(NULL,&dwBufferSize); if(dwRet==ERROR_INSUFFICIENT_BUFFER) { plfTable=(PIP_INTERFACE_INFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwBufferSize); GetInterfaceInfo(plfTable,&dwBufferSize); } for (i = 0;i<plfTable->NumAdapters;i ) { AdaptMap=plfTable->Adapter[i]; if (AdaptMap.Index == nIndex) { dwRet=MprConfigGetFriendlyName(hMprConfig,AdaptMap.Name,szFriendName,tchSize); nLen = WideCharToMultiByte( CP_ACP,NULL, szFriendName,-1,NULL,0,NULL,FALSE ); WideCharToMultiByte (CP_ACP,NULL,szFriendName,-1,szName,nLen,NULL,FALSE); } } HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY,plfTable); return szName; } INT ShowInfo(BOOL bAll) { PIP_ADAPTER_INFO pAdapterInfo = NULL;//这句要 PIP_ADAPTER_INFO pAdapter = NULL;//这句要 ULONG adaptOutBufLen;//这句要 PFIXED_INFO pFixedInfo; ULONG netOutBufLen; PIP_ADDR_STRING pIPAddr = NULL; DWORD ErrRet = 0; /* assign memory for call to GetNetworkParams */ pFixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) ); netOutBufLen = sizeof(FIXED_INFO); /* assign memory for call to GetAdapterInfo */ pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof( IP_ADAPTER_INFO ) );//这句要 adaptOutBufLen = sizeof(IP_ADAPTER_INFO);//这句要 /* set required buffer size */ if(GetNetworkParams(pFixedInfo, &netOutBufLen) == ERROR_BUFFER_OVERFLOW) { GlobalFree(pFixedInfo); pFixedInfo = (FIXED_INFO *) GlobalAlloc(GPTR, netOutBufLen); } /* set required buffer size */ if (GetAdaptersInfo( pAdapterInfo, &adaptOutBufLen) == ERROR_BUFFER_OVERFLOW) //这句要 { free(pAdapterInfo);//这句要 pAdapterInfo = (IP_ADAPTER_INFO *) malloc (adaptOutBufLen);//这句要 } if ((ErrRet = GetAdaptersInfo(pAdapterInfo, &adaptOutBufLen)) != NO_ERROR) { _tprintf(_T("GetAdaptersInfo failed : ")); DoFormatMessage(ErrRet); return EXIT_FAILURE; } if ((ErrRet = GetNetworkParams(pFixedInfo, &netOutBufLen)) != NO_ERROR) { _tprintf(_T("GetNetworkParams failed : ")); DoFormatMessage(ErrRet); return EXIT_FAILURE; } pAdapter = pAdapterInfo; //HKEY hKey; //LPCTSTR lpSubKey = _T("SYSTEM\\ControlSet\\Control\\Network"); //_tprintf(_T("\n1jjk Configuration\n\n")); if (bAll) { _tprintf(_T("\tHost Name . . . . . . . . . . . . : %s\n"), pFixedInfo->HostName); _tprintf(_T("\tPrimary DNS Suffix. . . . . . . . : \n")); _tprintf(_T("\tNode Type . . . . . . . . . . . . : %s\n"), GetNodeTypeName(pFixedInfo->NodeType)); if (pFixedInfo->EnableRouting) _tprintf(_T("\tIP Routing Enabled. . . . . . . . : Yes\n")); else _tprintf(_T("\tIP Routing Enabled. . . . . . . . : No\n")); if (pAdapter->HaveWins) _tprintf(_T("\tWINS Proxy enabled. . . . . . . . : Yes\n")); else _tprintf(_T("\tWINS Proxy enabled. . . . . . . . : No\n")); _tprintf(_T("\tDNS Suffix Search List. . . . . . : %s\n"), pFixedInfo->DomainName); } while (pAdapter) { _tprintf(_T("\n%s ...... %s : \n\n"), GetInterfaceTypeName(pAdapter->Type),GetAdapterName(pAdapter->Index)); /* check if the adapter is connected to the media */ if (_tcscmp(pAdapter->IpAddressList.IpAddress.String, "0.0.0.0") == 0) { _tprintf(_T("\tMedia State . . . . . . . . . . . : Media disconnected\n")); //pAdapter = pAdapter->Next; //continue; } _tprintf(_T("\tConnection-specific DNS Suffix. . : %s\n"), pFixedInfo->DomainName); if (bAll) { _tprintf(_T("\tDescription . . . . . . . . . . . : %s\n"), pAdapter->Description); _tprintf(_T("\tPhysical Address. . . . . . . . . : %s\n"), PrintMacAddr(pAdapter->Address)); if (pAdapter->DhcpEnabled) _tprintf(_T("\tDHCP Enabled. . . . . . . . . . . : Yes\n")); else _tprintf(_T("\tDHCP Enabled. . . . . . . . . . . : No\n")); _tprintf(_T("\tAutoconfiguration Enabled . . . . : \n")); } _tprintf(_T("\tAdapter Name. . . . . . . . . . . . : %s\n"), pAdapter->AdapterName); _tprintf(_T("\tIP Address. . . . . . . . . . . . : %s\n"), pAdapter->IpAddressList.IpAddress.String); _tprintf(_T("\tSubnet Mask . . . . . . . . . . . : %s\n"), pAdapter->IpAddressList.IpMask.String); _tprintf(_T("\tDefault Gateway . . . . . . . . . : %s\n"), pAdapter->GatewayList.IpAddress.String); if (bAll) { if (pAdapter->DhcpEnabled) _tprintf(_T("\tDHCP Server . . . . . . . . . . . : %s\n"), pAdapter->DhcpServer.IpAddress.String); _tprintf(_T("\tDNS Servers . . . . . . . . . . . : ")); _tprintf(_T("%s\n"), pFixedInfo->DnsServerList.IpAddress.String); pIPAddr = pFixedInfo -> DnsServerList.Next; while (pIPAddr) { _tprintf(_T("\t\t\t\t\t %s\n"), pIPAddr ->IpAddress.String ); pIPAddr = pIPAddr ->Next; } if (pAdapter->HaveWins) { _tprintf(_T("\tPrimary WINS Server . . . . . . . : %s\n"), pAdapter->PrimaryWinsServer.IpAddress.String); _tprintf(_T("\tSecondard WINS Server . . . . . . : %s\n"), pAdapter->SecondaryWinsServer.IpAddress.String); } //if (pAdapter->DhcpEnabled) //{ // _tprintf(_T("\tLease Obtained. . . . . . . . . . : %s"), asctime(localtime(&pAdapter->LeaseObtained))); // _tprintf(_T("\tLease Expires . . . . . . . . . . : %s"), asctime(localtime(&pAdapter->LeaseExpires))); //} } _tprintf(_T("\n")); pAdapter = pAdapter->Next; } return 0; } //以上是或者我们在ipconfig时的信息,在win下可以看到的 INT Release(TCHAR Index) { IP_ADAPTER_INDEX_MAP AdapterInfo; DWORD dwRetVal = 0; /* if interface is not given, query GetInterfaceInfo */ if (Index == (TCHAR)NULL) { PIP_INTERFACE_INFO pInfo; ULONG ulOutBufLen; pInfo = (IP_INTERFACE_INFO *) malloc(sizeof(IP_INTERFACE_INFO)); ulOutBufLen = 0; /* Make an initial call to GetInterfaceInfo to get * the necessary size into the ulOutBufLen variable */ if ( GetInterfaceInfo(pInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER) { GlobalFree(pInfo); pInfo = (IP_INTERFACE_INFO *) malloc (ulOutBufLen); } /* Make a second call to GetInterfaceInfo to get the actual data we want */ if ((dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen)) == NO_ERROR ) { AdapterInfo = pInfo->Adapter[0]; _tprintf(_T("name - %S\n"), pInfo->Adapter[0].Name); } else { _tprintf(_T("\nGetInterfaceInfo failed : ")); DoFormatMessage(dwRetVal); } } else { ; /* we need to be able to release connections by name with support for globbing * i.e. ipconfig /release Eth* will release all cards starting with Eth... * ipconfig /release *con* will release all cards with 'con' in their name */ } /* Call IpReleaseAddress to release the IP address on the specified adapter. */ if ((dwRetVal = IpReleaseAddress(&AdapterInfo)) != NO_ERROR) { _tprintf(_T("\nAn error occured while releasing interface %s : "), _T("*name*")); DoFormatMessage(dwRetVal); } return 0; } INT Renew(TCHAR Index) { IP_ADAPTER_INDEX_MAP AdapterInfo; DWORD dwRetVal = 0; /* if interface is not given, query GetInterfaceInfo */ if (Index == (TCHAR)NULL) { PIP_INTERFACE_INFO pInfo; ULONG ulOutBufLen; pInfo = (IP_INTERFACE_INFO *) malloc(sizeof(IP_INTERFACE_INFO)); ulOutBufLen = 0; /* Make an initial call to GetInterfaceInfo to get * the necessary size into the ulOutBufLen variable */ if ( GetInterfaceInfo(pInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER) { GlobalFree(pInfo); pInfo = (IP_INTERFACE_INFO *) malloc (ulOutBufLen); } /* Make a second call to GetInterfaceInfo to get the actual data we want */ if ((dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen)) == NO_ERROR ) { AdapterInfo = pInfo->Adapter[0]; _tprintf(_T("name - %S\n"), pInfo->Adapter[0].Name); } else { _tprintf(_T("\nGetInterfaceInfo failed : ")); DoFormatMessage(dwRetVal); } } else { ; /* we need to be able to renew connections by name with support for globbing * i.e. ipconfig /renew Eth* will renew all cards starting with Eth... * ipconfig /renew *con* will renew all cards with 'con' in their name */ } /* Call IpRenewAddress to renew the IP address on the specified adapter. */ if ((dwRetVal = IpRenewAddress(&AdapterInfo)) != NO_ERROR) { _tprintf(_T("\nAn error occured while renew interface %s : "), _T("*name*")); DoFormatMessage(dwRetVal); } return 0; } /* temp func for testing purposes */ VOID Info() { // Declare and initialize variables PIP_INTERFACE_INFO pInfo; ULONG ulOutBufLen; DWORD dwRetVal; pInfo = (IP_INTERFACE_INFO *) malloc( sizeof(IP_INTERFACE_INFO) ); ulOutBufLen = sizeof(IP_INTERFACE_INFO); dwRetVal = 0; // Make an initial call to GetInterfaceInfo to get // the necessary size in the ulOutBufLen variable if ( GetInterfaceInfo(pInfo, &ulOutBufLen) == ERROR_INSUFFICIENT_BUFFER) { free(pInfo); pInfo = (IP_INTERFACE_INFO *) malloc (ulOutBufLen); } // Make a second call to GetInterfaceInfo to get // the actual data we need if ((dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen)) == NO_ERROR ) { int i; for (i=0; i<pInfo->NumAdapters; i ) { printf("\tAdapter Name: %S\n", pInfo->Adapter[i].Name); printf("\tAdapter Index: %ld\n", pInfo->Adapter[i].Index); printf("\tNum Adapters: %ld\n", pInfo->NumAdapters); } } else { printf("GetInterfaceInfo failed.\n"); DoFormatMessage(dwRetVal); } } VOID Usage(VOID) { _tprintf(_T("\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")); } int main(int argc, char *argv[]) { BOOL DoUsage=FALSE; BOOL DoAll=FALSE; BOOL DoRelease=FALSE; BOOL DoRenew=FALSE; BOOL DoFlushdns=FALSE; BOOL DoRegisterdns=FALSE; BOOL DoDisplaydns=FALSE; BOOL DoShowclassid=FALSE; BOOL DoSetclassid=FALSE; /* Parse command line for options we have been given. */ if ( (argc > 1)&&(argv[1][0]=='/') ) { if( !_tcsicmp( &argv[1][1], _T("?") )) { DoUsage = TRUE; } else if( !_tcsnicmp( &argv[1][1], _T("ALL"), _tcslen(&argv[1][1]) )) { DoAll = TRUE; } else if( !_tcsnicmp( &argv[1][1], _T("RELEASE"), _tcslen(&argv[1][1]) )) { DoRelease = TRUE; } else if( ! _tcsnicmp( &argv[1][1], _T("RENEW"), _tcslen(&argv[1][1]) )) { DoRenew = TRUE; } else if( ! _tcsnicmp( &argv[1][1], _T("FLUSHDNS"), _tcslen(&argv[1][1]) )) { DoFlushdns = TRUE; } else if( ! _tcsnicmp( &argv[1][1], _T("FLUSHREGISTERDNS"), _tcslen(&argv[1][1]) )) { DoRegisterdns = TRUE; } else if( ! _tcsnicmp( &argv[1][1], _T("DISPLAYDNS"), _tcslen(&argv[1][1]) )) { DoDisplaydns = TRUE; } else if( ! _tcsnicmp( &argv[1][1], _T("SHOWCLASSID"), _tcslen(&argv[1][1]) )) { DoShowclassid = TRUE; } else if( ! _tcsnicmp( &argv[1][1], _T("SETCLASSID"), _tcslen(&argv[1][1]) )) { DoSetclassid = TRUE; } } switch (argc) { case 1: /* Default behaviour if no options are given*/ ShowInfo(FALSE); break; case 2: /* Process all the options that take no paramiters */ if (DoUsage) Usage(); else if (DoAll) ShowInfo(TRUE); else if (DoRelease) Release((TCHAR)NULL); else if (DoRenew) Renew((TCHAR)NULL); else if (DoFlushdns) _tprintf(_T("\nSorry /flushdns is not implemented yet\n")); else if (DoRegisterdns) _tprintf(_T("\nSorry /registerdns is not implemented yet\n")); else if (DoDisplaydns) _tprintf(_T("\nSorry /displaydns is not implemented yet\n")); else Usage(); break; case 3: /* Process all the options that can have 1 paramiters */ if (DoRelease) _tprintf(_T("\nSorry /release [adapter] is not implemented yet\n")); //Release(argv[2]); else if (DoRenew) _tprintf(_T("\nSorry /renew [adapter] is not implemented yet\n")); else if (DoShowclassid) _tprintf(_T("\nSorry /showclassid adapter is not implemented yet\n")); else if (DoSetclassid) _tprintf(_T("\nSorry /setclassid adapter is not implemented yet\n")); else Usage(); break; case 4: /* Process all the options that can have 2 paramiters */ if (DoSetclassid) _tprintf(_T("\nSorry /setclassid adapter [classid]is not implemented yet\n")); else Usage(); break; default: Usage(); } return 0; }