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
請按任意鍵繼續. . .
結束程序.......
貌似基本想要看到的信息都拿到了。nice。。。。。。
如果需要更多,可以參照微軟官方的說明文檔進行操作。
學習麼?誰還不是個學生娃呢!