windows下iphelper工具的實現

windows上涉及到網絡編程的都必須懂得查看和操作網卡。重點是怎麼幹?查手冊是個好習慣!

iphelper 官方文檔連接

 

然後貼一下源碼:

// miniIphelper.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//

#include "pch.h"
#include <iostream>

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>

#include <winsock2.h>
#include <ws2tcpip.h>

#include <iphlpapi.h>

#include <stdio.h>
#include <time.h>

// Need to link with Iphlpapi.lib and Ws2_32.lib
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */

int main()
{

	/* Some general variables */
	ULONG ulOutBufLen;
	DWORD dwRetVal;
	unsigned int i;

	/* variables used for GetNetworkParams */
	FIXED_INFO *pFixedInfo;
	IP_ADDR_STRING *pIPAddr;

	/* variables used for GetAdapterInfo */
	IP_ADAPTER_INFO *pAdapterInfo;
	IP_ADAPTER_INFO *pAdapter;

	/* variables used to print DHCP time info */
	struct tm newtime;
	char buffer[32];
	errno_t error;

	/* variables used for GetInterfaceInfo */
	IP_INTERFACE_INFO *pInterfaceInfo;

	/* variables used for GetIpAddrTable */
	MIB_IPADDRTABLE *pIPAddrTable;
	DWORD dwSize;
	IN_ADDR IPAddr;
	char *strIPAddr;

	/* variables used for AddIpAddress */
	UINT iaIPAddress;
	UINT imIPMask;
	ULONG NTEContext;
	ULONG NTEInstance;

	/* variables used for GetIpStatistics */
	MIB_IPSTATS *pStats;

	/* variables used for GetTcpStatistics */
	MIB_TCPSTATS *pTCPStats;

	printf("------------------------\n");
	printf("This is GetNetworkParams\n");
	printf("------------------------\n");

	pFixedInfo = (FIXED_INFO *)MALLOC(sizeof(FIXED_INFO));
	if (pFixedInfo == NULL) {
		printf("Error allocating memory needed to call GetNetworkParams\n");
		return 1;
	}
	ulOutBufLen = sizeof(FIXED_INFO);

	if (GetNetworkParams(pFixedInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
		FREE(pFixedInfo);
		pFixedInfo = (FIXED_INFO *)MALLOC(ulOutBufLen);
		if (pFixedInfo == NULL) {
			printf("Error allocating memory needed to call GetNetworkParams\n");
			return 1;
		}
	}

	if (dwRetVal = GetNetworkParams(pFixedInfo, &ulOutBufLen) != NO_ERROR) {
		printf("GetNetworkParams failed with error %d\n", dwRetVal);
		if (pFixedInfo)
			FREE(pFixedInfo);
		return 1;
	}
	else {
		printf("\tHost Name: %s\n", pFixedInfo->HostName);
		printf("\tDomain Name: %s\n", pFixedInfo->DomainName);
		printf("\tDNS Servers:\n");
		printf("\t\t%s\n", pFixedInfo->DnsServerList.IpAddress.String);

		pIPAddr = pFixedInfo->DnsServerList.Next;
		while (pIPAddr) {
			printf("\t\t%s\n", pIPAddr->IpAddress.String);
			pIPAddr = pIPAddr->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);

		if (pFixedInfo->EnableRouting)
			printf("\tIP Routing Enabled: Yes\n");
		else
			printf("\tIP Routing Enabled: No\n");

		if (pFixedInfo->EnableProxy)
			printf("\tWINS Proxy Enabled: Yes\n");
		else
			printf("\tWINS Proxy Enabled: No\n");

		if (pFixedInfo->EnableDns)
			printf("\tNetBIOS Resolution Uses DNS: Yes\n");
		else
			printf("\tNetBIOS Resolution Uses DNS: No\n");
	}

	/* Free allocated memory no longer needed */
	if (pFixedInfo) {
		FREE(pFixedInfo);
		pFixedInfo = NULL;
	}

	printf("------------------------\n");
	printf("This is GetAdaptersInfo\n");
	printf("------------------------\n");

	pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(sizeof(IP_ADAPTER_INFO));
	if (pAdapterInfo == NULL) {
		printf("Error allocating memory needed to call GetAdapterInfo\n");
		return 1;
	}
	ulOutBufLen = sizeof(IP_ADAPTER_INFO);

	if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
		FREE(pAdapterInfo);
		pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen);
		if (pAdapterInfo == NULL) {
			printf("Error allocating memory needed to call GetAdapterInfo\n");
			return 1;
		}
	}

	if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) != NO_ERROR) {
		printf("GetAdaptersInfo failed with error %d\n", dwRetVal);
		if (pAdapterInfo)
			FREE(pAdapterInfo);
		return 1;
	}

	pAdapter = pAdapterInfo;
	while (pAdapter) {
		printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);
		printf("\tAdapter Desc: \t%s\n", pAdapter->Description);
		printf("\tAdapter Addr: \t");
		for (i = 0; i < (int)pAdapter->AddressLength; i++) {
			if (i == (pAdapter->AddressLength - 1))
				printf("%.2X\n", (int)pAdapter->Address[i]);
			else
				printf("%.2X-", (int)pAdapter->Address[i]);
		}
		printf("\tIP Address: \t%s\n",
			pAdapter->IpAddressList.IpAddress.String);
		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) {
			printf("\tDHCP Enabled: \tYes\n");
			printf("\tDHCP Server: \t%s\n",
				pAdapter->DhcpServer.IpAddress.String);

			printf("\tLease Obtained: ");
			/* Display local time */
			error = _localtime32_s(&newtime, (__time32_t*)&pAdapter->LeaseObtained);
			if (error)
				printf("\tInvalid Argument to _localtime32_s\n");

			else {
				// Convert to an ASCII representation 
				error = asctime_s(buffer, 32, &newtime);
				if (error)
					printf("Invalid Argument to asctime_s\n");
				else
					/* asctime_s returns the string terminated by \n\0 */
					printf("%s", buffer);
			}

			printf("\tLease Expires:  ");
			error = _localtime32_s(&newtime, (__time32_t*)&pAdapter->LeaseExpires);
			if (error)
				printf("Invalid Argument to _localtime32_s\n");
			else {
				// Convert to an ASCII representation 
				error = asctime_s(buffer, 32, &newtime);
				if (error)
					printf("Invalid Argument to asctime_s\n");
				else
					/* asctime_s returns the string terminated by \n\0 */
					printf("%s", buffer);
			}
		}
		else
			printf("\tDHCP Enabled: \tNo\n");

		if (pAdapter->HaveWins) {
			printf("\tHave Wins: \tYes\n");
			printf("\tPrimary Wins Server: \t%s\n",
				pAdapter->PrimaryWinsServer.IpAddress.String);
			printf("\tSecondary Wins Server: \t%s\n",
				pAdapter->SecondaryWinsServer.IpAddress.String);
		}
		else
			printf("\tHave Wins: \tNo\n");

		printf("\n");
		pAdapter = pAdapter->Next;
	}

	printf("------------------------\n");
	printf("This is GetInterfaceInfo\n");
	printf("------------------------\n");

	pInterfaceInfo = (IP_INTERFACE_INFO *)MALLOC(sizeof(IP_INTERFACE_INFO));
	if (pInterfaceInfo == NULL) {
		printf("Error allocating memory needed to call GetInterfaceInfo\n");
		return 1;
	}
	ulOutBufLen = sizeof(IP_INTERFACE_INFO);
	if (GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen) ==
		ERROR_INSUFFICIENT_BUFFER) {
		FREE(pInterfaceInfo);
		pInterfaceInfo = (IP_INTERFACE_INFO *)MALLOC(ulOutBufLen);
		if (pInterfaceInfo == NULL) {
			printf("Error allocating memory needed to call GetInterfaceInfo\n");
			return 1;
		}
		printf("\t The size needed for the output buffer ulLen = %ld\n",
			ulOutBufLen);
	}

	if ((dwRetVal = GetInterfaceInfo(pInterfaceInfo, &ulOutBufLen)) == NO_ERROR) {
		printf("\tNum Adapters: %ld\n\n", pInterfaceInfo->NumAdapters);
		for (i = 0; i < (unsigned int)pInterfaceInfo->NumAdapters; i++) {
			printf("\tAdapter Index[%d]: %ld\n", i,
				pInterfaceInfo->Adapter[i].Index);
			printf("\tAdapter Name[%d]:  %ws\n\n", i,
				pInterfaceInfo->Adapter[i].Name);
		}
		printf("GetInterfaceInfo call succeeded.\n");
	}
	else {
		LPVOID lpMsgBuf = NULL;

		if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),       // Default language
			(LPTSTR)& lpMsgBuf, 0, NULL)) {
			printf("\tError: %s", lpMsgBuf);
		}
		LocalFree(lpMsgBuf);
	}

	/* If DHCP enabled, release and renew the IP address */
	/* THIS WORKS BUT IT TAKES A LONG TIME AND INTERRUPTS NET CONNECTIONS */
	if (pAdapterInfo->DhcpEnabled && pInterfaceInfo->NumAdapters) {
		printf("Calling IpReleaseAddress for Adapter[%d]\n", 0);
		if ((dwRetVal =
			IpReleaseAddress(&pInterfaceInfo->Adapter[0])) == NO_ERROR) {
			printf("Ip Release succeeded.\n");
		}
		if ((dwRetVal =
			IpRenewAddress(&pInterfaceInfo->Adapter[0])) == NO_ERROR) {
			printf("Ip Renew succeeded.\n");
		}
	}

	/* Free allocated memory no longer needed */
	if (pAdapterInfo) {
		FREE(pAdapterInfo);
		pAdapterInfo = NULL;
	}
	if (pInterfaceInfo) {
		FREE(pInterfaceInfo);
		pInterfaceInfo = NULL;
	}

	printf("----------------------\n");
	printf("This is GetIpAddrTable\n");
	printf("----------------------\n");

	pIPAddrTable = (MIB_IPADDRTABLE *)MALLOC(sizeof(MIB_IPADDRTABLE));
	if (pIPAddrTable == NULL) {
		printf("Error allocating memory needed to call GetIpAddrTable\n");
		return 1;
	}
	dwSize = 0;
	IPAddr.S_un.S_addr = ntohl(pIPAddrTable->table[1].dwAddr);
	strIPAddr = inet_ntoa(IPAddr);

	if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
		FREE(pIPAddrTable);
		pIPAddrTable = (MIB_IPADDRTABLE *)MALLOC(dwSize);
		if (pIPAddrTable == NULL) {
			printf("Error allocating memory needed to call GetIpAddrTable\n");
			return 1;
		}
	}

	if ((dwRetVal = GetIpAddrTable(pIPAddrTable, &dwSize, 0)) != NO_ERROR) {
		printf("GetIpAddrTable failed with error %d\n", dwRetVal);
		if (pIPAddrTable)
			FREE(pIPAddrTable);
		return 1;
	}

	printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries);
	for (i = 0; i < (unsigned int)pIPAddrTable->dwNumEntries; i++) {
		printf("\n\tInterface Index[%d]:\t%ld\n", i,
			pIPAddrTable->table[i].dwIndex);
		IPAddr.S_un.S_addr = (u_long)pIPAddrTable->table[i].dwAddr;
		printf("\tIP Address[%d]:     \t%s\n", i, inet_ntoa(IPAddr));
		IPAddr.S_un.S_addr = (u_long)pIPAddrTable->table[i].dwMask;
		printf("\tSubnet Mask[%d]:    \t%s\n", i, inet_ntoa(IPAddr));
		IPAddr.S_un.S_addr = (u_long)pIPAddrTable->table[i].dwBCastAddr;
		printf("\tBroadCast[%d]:      \t%s (%ld%)\n", i, inet_ntoa(IPAddr),
			pIPAddrTable->table[i].dwBCastAddr);
		printf("\tReassembly size[%d]:\t%ld\n", i,
			pIPAddrTable->table[i].dwReasmSize);
		printf("\tAddress Index[%d]:  \t%ld\n", i,
			pIPAddrTable->table[i].dwIndex);
		printf("\tType and State[%d]:", i);
		if (pIPAddrTable->table[i].wType & MIB_IPADDR_PRIMARY)
			printf("\tPrimary IP Address");
		if (pIPAddrTable->table[i].wType & MIB_IPADDR_DYNAMIC)
			printf("\tDynamic IP Address");
		if (pIPAddrTable->table[i].wType & MIB_IPADDR_DISCONNECTED)
			printf("\tAddress is on disconnected interface");
		if (pIPAddrTable->table[i].wType & MIB_IPADDR_DELETED)
			printf("\tAddress is being deleted");
		if (pIPAddrTable->table[i].wType & MIB_IPADDR_TRANSIENT)
			printf("\tTransient address");
		printf("net adapter--------------------------------------------------------------");
		printf("\n");
	}

	iaIPAddress = inet_addr("192.168.1.177");
	imIPMask = inet_addr("255.255.255.0");

	NTEContext = 0;
	NTEInstance = 0;

	if ((dwRetVal = AddIPAddress(iaIPAddress,
		imIPMask,
		pIPAddrTable->table[0].
		dwIndex,
		&NTEContext, &NTEInstance)) != NO_ERROR) {

		LPVOID lpMsgBuf;
		printf("\tError adding IP address.\n");

		if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),       // Default language
			(LPTSTR)& lpMsgBuf, 0, NULL)) {
			printf("\tError: %s", lpMsgBuf);
		}
		LocalFree(lpMsgBuf);
	}

	if ((dwRetVal = DeleteIPAddress(NTEContext)) != NO_ERROR) {
		printf("DeleteIPAddress failed with error %d\n", dwRetVal);
	}

	/* Free allocated memory no longer needed */
	if (pIPAddrTable) {
		FREE(pIPAddrTable);
		pIPAddrTable = NULL;
	}

	printf("-------------------------\n");
	printf("This is GetIPStatistics()\n");
	printf("-------------------------\n");

	pStats = (MIB_IPSTATS *)MALLOC(sizeof(MIB_IPSTATS));
	if (pStats == NULL) {
		printf("Error allocating memory needed to call GetIpStatistics\n");
		return 1;
	}

	if ((dwRetVal = GetIpStatistics(pStats)) != NO_ERROR) {
		printf("GetIPStatistics failed with error %d\n", dwRetVal);
		if (pStats)
			FREE(pStats);
		return 1;
	}

	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);

	/* Free allocated memory no longer needed */
	if (pStats) {
		FREE(pStats);
		pStats = NULL;
	}

	printf("-------------------------\n");
	printf("This is GetTCPStatistics()\n");
	printf("-------------------------\n");

	pTCPStats = (MIB_TCPSTATS *)MALLOC(sizeof(MIB_TCPSTATS));
	if (pTCPStats == NULL) {
		printf("Error allocating memory needed to call GetTcpStatistics\n");
		return 1;
	}

	if ((dwRetVal = GetTcpStatistics(pTCPStats)) != NO_ERROR) {
		printf("GetTcpStatistics failed with error %d\n", dwRetVal);
		if (pTCPStats)
			FREE(pTCPStats);
		return 1;
	}

	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);

	/* Free allocated memory no longer needed */
	if (pTCPStats) {
		FREE(pTCPStats);
		pTCPStats = NULL;
	}

	system("pause");
	printf("結束程序.......");

	return 0;
}

 

如果編譯過程中報錯;

在項目屬性——預編譯器中添加宏

_WINSOCK_DEPRECATED_NO_WARNINGS

然後就大吉大利了。

看看運行結果:

------------------------
This is GetNetworkParams
------------------------
        Host Name: SD-20190725FZOP
        Domain Name:
        DNS Servers:
                8.8.8.8
                114.114.114.114
        Node Type: Hybrid
        NetBIOS Scope ID:
        IP Routing Enabled: No
        WINS Proxy Enabled: No
        NetBIOS Resolution Uses DNS: No
------------------------
This is GetAdaptersInfo
------------------------
        Adapter Name:   {B7615724-E24D-493A-82D4-221DFDA9D91B}
        Adapter Desc:   Realtek PCIe GBE Family Controller
        Adapter Addr:   6C-4B-90-12-95-D2
        IP Address:     192.168.1.177
        IP Mask:        255.255.255.0
        Gateway:        192.168.1.1
        ***
        DHCP Enabled:   No
        Have Wins:      No

        Adapter Name:   {02DCE4E6-A0FF-48DC-8514-9CFE266EAA73}
        Adapter Desc:   TAP-Windows Adapter V9
        Adapter Addr:   00-FF-02-DC-E4-E6
        IP Address:     10.8.0.10
        IP Mask:        255.255.255.252
        Gateway:        0.0.0.0
        ***
        DHCP Enabled:   Yes
        DHCP Server:    10.8.0.9
        Lease Obtained: Mon Dec 30 17:47:27 2019
        Lease Expires:  Tue Mar 24 03:11:08 2037
        Have Wins:      No

------------------------
This is GetInterfaceInfo
------------------------
         The size needed for the output buffer ulLen = 3132
        Num Adapters: 2

        Adapter Index[0]: 13
        Adapter Name[0]:  \DEVICE\TCPIP_{B7615724-E24D-493A-82D4-221DFDA9D91B}

        Adapter Index[1]: 5
        Adapter Name[1]:  \DEVICE\TCPIP_{02DCE4E6-A0FF-48DC-8514-9CFE266EAA73}

GetInterfaceInfo call succeeded.
----------------------
This is GetIpAddrTable
----------------------
        Num Entries: 3

        Interface Index[0]:     13
        IP Address[0]:          192.168.1.177
        Subnet Mask[0]:         255.255.255.0
        BroadCast[0]:           1.0.0.0 (1)
        Reassembly size[0]:     65535
        Address Index[0]:       13
        Type and State[0]:      Primary IP Addressnet adapter--------------------------------------------------------------

        Interface Index[1]:     1
        IP Address[1]:          127.0.0.1
        Subnet Mask[1]:         255.0.0.0
        BroadCast[1]:           1.0.0.0 (1)
        Reassembly size[1]:     65535
        Address Index[1]:       1
        Type and State[1]:      Primary IP Addressnet adapter--------------------------------------------------------------

        Interface Index[2]:     5
        IP Address[2]:          10.8.0.10
        Subnet Mask[2]:         255.255.255.252
        BroadCast[2]:           1.0.0.0 (1)
        Reassembly size[2]:     65535
        Address Index[2]:       5
        Type and State[2]:      Primary IP Address      Dynamic IP Addressnet adapter--------------------------------------------------------------
        Error adding IP address.
DeleteIPAddress failed with error 1168
-------------------------
This is GetIPStatistics()
-------------------------
        Number of IP addresses: 18
        Number of Interfaces: 3
        Receives: 1071079
        Out Requests: 916361
        Routes: 15
        Timeout Time: 60
        In Delivers: 1062655
        In Discards: 46951
        Total In: 1109606
        In Header Errors: 0
-------------------------
This is GetTCPStatistics()
-------------------------
        Active Opens: 56926
        Passive Opens: 6082
        Segments Recv: 1517404
        Segments Xmit: 1313639
        Total # Conxs: 200
請按任意鍵繼續. . .
結束程序.......

 

貌似基本想要看到的信息都拿到了。nice。。。。。。

如果需要更多,可以參照微軟官方的說明文檔進行操作。

學習麼?誰還不是個學生娃呢!

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章