Windows网络编程(六):IP Helper

IP Helper是Windows系统与IP配置和管理的重要接口,通过IP Helper 可以获得很多跟网络配置相关的信息。比如说本机IP、网关设置、网卡数量和连接信息。

#include <windows.h>
#include "iphlpapi.h"
/* 全局变量 */
ULONG ulOutBufLen;
DWORD dwRetVal;
HANDLE hHeap = GetProcessHeap();
/* 宏定义*/
#define MyAlloc(size) HeapAlloc(hHeap, 0, size)
#define MyFree(ptr) HeapFree(hHeap, 0, ptr)/*************************************
* main
* 功能 演示IP Helper函数的使用方法
**************************************/
void main(int ac, char* av[])
{
	// GetNetworkParams
	printf("------------------------\n");
	printf("GetNetworkParams\n\n");
	// 所需的变量
	FIXED_INFO *pFixedInfo;
	IP_ADDR_STRING *pIPAddr;
	// 分配内存
	pFixedInfo = (FIXED_INFO *)MyAlloc(sizeof(FIXED_INFO));
	ulOutBufLen = sizeof(FIXED_INFO);

	if (GetNetworkParams(pFixedInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
	{
		// 空间不足,重新分配
		MyFree(pFixedInfo);
		pFixedInfo = (FIXED_INFO *)MyAlloc(ulOutBufLen);
	}
	// 获取信息
	if (dwRetVal = GetNetworkParams(pFixedInfo, &ulOutBufLen) != NO_ERROR)
	{
		printf("Call to GetNetworkParams failed.\n");
	}
	else
	{
		// 打印输出
		printf("\tHost Name: %s\n", pFixedInfo->HostName);// 主机名
		printf("\tDomain Name: %s\n", pFixedInfo->DomainName);// DNS主机名
		printf("\tDNS Servers:\n");//DNS 服务器
		printf("\t\t%s\n", pFixedInfo->DnsServerList.IpAddress.String);// IP,字符串形式的
		​
			pIPAddr = pFixedInfo->DnsServerList.Next;// 备用DNS
		while (pIPAddr)
		{
			printf("\t\t%s\n", pIPAddr->IpAddress.String);
			pIPAddr = pIPAddr->Next;
		}if (pFixedInfo->EnableRouting)// 是否路由
				printf("\tEnable Routing: Yes\n");
			else
				printf("\tEnable Routing: No\n");if (pFixedInfo->EnableProxy)// 是否有代理
				printf("\tEnable Proxy: Yes\n");
			else
				printf("\tEnable Proxy: No\n");if (pFixedInfo->EnableDns)// 是否有DNS
				printf("\tEnable DNS: Yes\n");
			else
				printf("\tEnable DNS: No\n");
	}
	MyFree(pFixedInfo);// 释放内存// GetNetworkParams
		printf("------------------------\n");
	printf("GetInterfaceInfo\n\n");
	// 变量定义、分配内存空间
	PIP_INTERFACE_INFO pInfo;
	ulOutBufLen = sizeof(IP_INTERFACE_INFO);
	pInfo = (PIP_INTERFACE_INFO)MyAlloc(ulOutBufLen);while (1)
		{
			dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);
			// 内在不足,重新分配
			if (dwRetVal == ERROR_INSUFFICIENT_BUFFER)
			{
				MyFree(pInfo);
				pInfo = (IP_INTERFACE_INFO *)MyAlloc(ulOutBufLen);
			}
			else if (dwRetVal == NO_ERROR)
			{
				// 显示输出每个网卡的信息
				int i;
				printf("Num Adapters: %ld\n", pInfo->NumAdapters);
				for (i = 0; i < pInfo->NumAdapters; i++)
				{
					printf("(%d)Adapter Name: %ws\n", i, pInfo->Adapter[i].Name);
					printf("(%d)Adapter Index: %ld\n", i, pInfo->Adapter[i].Index);
				}
				break;
			}
			else
				printf("GetInterfaceInfo: %u\n", GetLastError());
		}
	MyFree(pInfo);// 释放内存// GetIpAddrTable
		printf("----------------------\n");
	printf("GetIpAddrTable\n\n");

	// 变量定义、内存分配
	MIB_IPADDRTABLE *pIPAddrTable;
	DWORD dwSize;
	in_addr IPAddr;
	char *strIPAddr;
	​
		pIPAddrTable = (MIB_IPADDRTABLE*)MyAlloc(sizeof(MIB_IPADDRTABLE));
	dwSize = 0;
	IPAddr.S_un.S_addr = ntohl(pIPAddrTable->table[1].dwAddr);
	strIPAddr = inet_ntoa(IPAddr);if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER)
		{
			// 空间不足,重新分配
			MyFree(pIPAddrTable);
			pIPAddrTable = (MIB_IPADDRTABLE *)MyAlloc(dwSize);
		}
	// 获得信息并显示
	if ((dwRetVal = GetIpAddrTable(pIPAddrTable, &dwSize, 0)) != NO_ERROR)
	{
		printf("Call to GetIpAddrTable failed.\n");
	}
	// IP、掩码等是以DWORD的形式保存的
	printf("Address: %u.%u.%u.%u\n",
		pIPAddrTable->table[0].dwAddr & 0x000000FF,
		(pIPAddrTable->table[0].dwAddr & 0x0000FF00) >> 8,
		(pIPAddrTable->table[0].dwAddr & 0x00FF0000) >> 16,
		(pIPAddrTable->table[0].dwAddr & 0xFF000000) >> 24);
	printf("Mask: %lu\n", pIPAddrTable->table[0].dwMask);
	printf("Index: %lu\n", pIPAddrTable->table[0].dwIndex);
	printf("BCast: %lu\n", pIPAddrTable->table[0].dwBCastAddr);
	printf("Reasm: %lu\n", pIPAddrTable->table[0].dwReasmSize);MyFree(pIPAddrTable);// 释放内存// GetIPStatistics
		printf("-------------------------\n");
	printf("GetIPStatistics\n\n");
	// 定义变量,分配内存
	MIB_IPSTATS *pStats;
	pStats = (MIB_IPSTATS*)MyAlloc(sizeof(MIB_IPSTATS));

	// 获取信息
	if ((dwRetVal = GetIpStatistics(pStats)) != NO_ERROR)
	{
		printf("\tError getting stats.\n");
	}
	// 显示
	printf("\tNumber of IP addresses: %ld\n", pStats->dwNumAddr);
	printf("\tNumber of Interfaces: %ld\n", pStats->dwNumIf);
	printf("\tReceives: %ld\n", pStats->dwInReceives);
	printf("\tOut Requests: %ld\n", pStats->dwOutRequests);
	printf("\tRoutes: %ld\n", pStats->dwNumRoutes);
	printf("\tTimeout Time: %ld\n", pStats->dwReasmTimeout);
	printf("\tIn Delivers: %ld\n", pStats->dwInDelivers);
	printf("\tIn Discards: %ld\n", pStats->dwInDiscards);
	printf("\tTotal In: %ld\n", pStats->dwInDelivers + pStats->dwInDiscards);
	printf("\tIn Header Errors: %ld\n", pStats->dwInHdrErrors);
	MyFree(pStats);// 释放

	// GetTCPStatistics
	printf("-------------------------\n");
	printf("GetTCPStatistics\n\n");
	// 定义变量,分配空间
	MIB_TCPSTATS *pTCPStats;
	pTCPStats = (MIB_TCPSTATS*)MyAlloc(sizeof(MIB_TCPSTATS));

	// 获取信息,并显示
	if ((dwRetVal = GetTcpStatistics(pTCPStats)) != NO_ERROR)
		printf("Error getting TCP Stats.\n");
	printf("\tActive Opens: %ld\n", pTCPStats->dwActiveOpens);
	printf("\tPassive Opens: %ld\n", pTCPStats->dwPassiveOpens);
	printf("\tSegments Recv: %ld\n", pTCPStats->dwInSegs);
	printf("\tSegments Xmit: %ld\n", pTCPStats->dwOutSegs);
	printf("\tTotal # Conxs: %ld\n", pTCPStats->dwNumConns);
	MyFree(pTCPStats);// 释放内存// GetAdapatersInfo
		printf("------------------------\n");
	printf("GetAdapatersInfo\n\n");
	// 定义变量,分配内存
	IP_ADAPTER_INFO *pAdapterInfo;
	IP_ADAPTER_INFO *pAdapter;
	pAdapterInfo = (IP_ADAPTER_INFO *)MyAlloc(sizeof(IP_ADAPTER_INFO));
	ulOutBufLen = sizeof(IP_ADAPTER_INFO);

	// Test,所需内存大小
	if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
	{
		MyFree(pAdapterInfo);
		pAdapterInfo = (IP_ADAPTER_INFO *)MyAlloc(ulOutBufLen);
	}
	// 获得信息
	if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) != NO_ERROR)
	{
		printf("Call to GetAdaptersInfo failed.\n");
	}
	pAdapter = pAdapterInfo;
	// 显示各个网卡的信息
	while (pAdapter)
	{
		printf("\n\t***********\n");
		printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);// 网卡设备名
		printf("\tAdapter Desc: \t%s\n", pAdapter->Description);// 描述
		printf("\tAdapter Addr: \t%ld\n", pAdapter->Address);// MAC
		printf("\tIP Address: \t%s\n", pAdapter->IpAddressList.IpAddress.String);// IP
		printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);// 掩码printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);// 网关
		printf("\t***\n");
		if (pAdapter->DhcpEnabled)// DHCP
		{
			printf("\tDHCP Enabled: Yes\n");
			printf("\t\tDHCP Server: \t%s\n", pAdapter->DhcpServer.IpAddress.String);
			printf("\tLease Obtained: %ld\n", pAdapter->LeaseObtained);
		}
		else
			printf("\tDHCP Enabled: No\n");
		if (pAdapter->HaveWins)// Wins
		{
			printf("\tHave Wins: Yes\n");
			printf("\t\tPrimary Wins Server: \t%s\n", pAdapter->PrimaryWinsServer.IpAddress.String);
			printf("\t\tSecondary Wins Server: \t%s\n", pAdapter->SecondaryWinsServer.IpAddress.String);
		}
		else
			printf("\tHave Wins: No\n");
		pAdapter = pAdapter->Next;
	}
	MyFree(pAdapterInfo);// 释放}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值