#ifndef WIN32_LEAN_..._iphelper控件vb">
赞
踩
windows上涉及到网络编程的都必须懂得查看和操作网卡。重点是怎么干?查手册是个好习惯!
然后贴一下源码:
- // 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
- 请按任意键继续. . .
- 结束程序.......
貌似基本想要看到的信息都拿到了。
如果需要更多,可以参照微软官方的说明文档进行操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。