在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++网络编程 → c++ ipconfig源码(获取ip/dns/网关等信息)

c++ ipconfig源码(获取ip/dns/网关等信息)

C/C++网络编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:3.12M
  • 下载次数:35
  • 浏览次数:805
  • 发布时间:2018-05-06
  • 实例类别:C/C++网络编程
  • 发 布 人:286550591
  • 文件格式:.zip
  • 所需积分:2
 相关标签: Config IP c 源码

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】


#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;
}


标签: Config IP c 源码

实例下载地址

c++ ipconfig源码(获取ip/dns/网关等信息)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警