windows主机网络信息获取程序设计
掌握windows系統獲取網絡信息的各種API函數的功能與調用方法,掌握設計程序顯示獲取到相關網絡信息的方法,掌握網絡字節數據與主機字節數據之間的轉換。掌握這些API函數調用的錯誤處理方法。
利用本地網絡信息開發接口IP Helper API編寫主機網絡信息獲取程序依實現獲取網絡的配置信息、管理網絡適配器和獲取相關信息、管理網絡接口和獲取相關信息、獲取IP和ICMP中的信息、管理路由信息和獲取arp信息、接收TCP和UDP信息等的目的。
1.使用ipconfig獲取本地網絡信息
在cmd中使用ipconfig命令獲取網絡信息,結果見最后貼圖
?
2.利用IP Helper API獲取本地網絡適配器信息
編寫獲取本地網絡信息的程序,代碼如下:
#include "stdafx.h"
#pragma comment(lib, "IPHLPAPI.lib")
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
?
int _tmain(int argc, _TCHAR* argv[])
{
????// 指定獲取到的網絡信息結構體鏈表的指針
????IP_ADAPTER_INFO *pAdapterInfo;
????// 保存獲取到的網絡信息結構體鏈表的長度
????ULONG ulOutBufLen;
????// 返回調用編碼
????DWORD dwRetVal;
????// 在輪循所有網絡適配器信息時使用的單個結構體變量
????PIP_ADAPTER_INFO pAdapter;
?
????// 為pAdapterInfo分配空間
????pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
????ulOutBufLen = sizeof(IP_ADAPTER_INFO);
????// 第1次調用GetAdaptersInfo(),獲取返回結果的大小到ulOutBufLen中
????if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
????{
????????free(pAdapterInfo);
????????pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);
????}
????// 第2次調用GetAdaptersInfo(),獲取本地網絡信息到結構體pAdapterInfo中
????if((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) != ERROR_SUCCESS)
????{
????????printf("GetAdaptersInfo Error! %d\n", dwRetVal);
????}
????// 從pAdapterInfo 獲取并顯示本地網絡信息
????pAdapter = pAdapterInfo;
????while(pAdapter)
????{
????????printf("網絡適配器名: \t\t%s\n", pAdapter->AdapterName);
????????printf("網絡適配器描述: \t%s\n\n", pAdapter->Description);
????????printf("MAC地址: \t\t");
????????for(int i=0; i<pAdapter->AddressLength; i++)
????????{
????????????if(i==(pAdapter->AddressLength -1))
????????????????printf("%.2X\n", (int)pAdapter->Address[i]);
????????????else
????????????????printf("%.2X-", (int)pAdapter->Address[i]);
????????}
????????printf("IP地址: \t\t%s\n", pAdapter->IpAddressList.IpAddress.String);
????????printf("子網掩碼: \t\t%s\n", pAdapter->IpAddressList.IpMask.String);
????????printf("網關: \t\t\t%s\n", pAdapter->GatewayList.IpAddress.String);
????????printf("********************************************************************\n");
????????if(pAdapter->DhcpEnabled)
????????{
????????????printf("啟用DHCP: \t\t是\n");
????????????printf("DHCP服務器: \t\t%s\n", pAdapter->DhcpServer.IpAddress.String);
????????}
????????else
????????{
????????????printf("啟用DHCP: \t\t否\n");
????????}
?
????????// 處理下一人網絡適配器
????????pAdapter = pAdapter->Next;
????}
????// 釋放資源
????if(pAdapterInfo)
????????free(pAdapterInfo);
????
????printf("\n\n");
????system("pause");
????return 0;
}
?
程序運行結果見最后貼圖
3.獲取本地主機名、域名和DNS服務器信息:
編寫獲取本地網絡參數的信息的程序,代碼如下:
#include "stdafx.h"
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
?
#pragma comment(lib, "IPHLPAPI.lib")
?
int _tmain(int argc, _TCHAR* argv[])
{????????
????// 定義保存本地計算機網絡參數信息的結構體指針
????FIXED_INFO * FixedInfo;
????// 保存獲取到的本地計算機網絡參數信息結構體鏈表的長度
????ULONG ulOutBufLen;
????// 調用GetNetworkParams()函數的返回值
DWORD dwRetVal;
????// 保存所有DNS服務器的IP地址列表
IP_ADDR_STRING * pIPAddr;
?
????// 為FixedInfo結構體分配內存空間
????FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) );
????// 初始化ulOutBufLen變量值
ulOutBufLen = sizeof( FIXED_INFO );
?
????// 第1次調用GetNetworkParams()函數,獲取返回結果的大小到ulOutBufLen中
if( ERROR_BUFFER_OVERFLOW == GetNetworkParams( FixedInfo, &ulOutBufLen ) ) {
GlobalFree( FixedInfo );
????????FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, ulOutBufLen );
????}
?
????// 第2次調用GetNetworkParams()函數,以前面獲取的ulOutBufLen作為參數,
if ( dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen ) != ERROR_SUCCESS) {
printf( "調用GetNetworkParams()函數失敗。返回值: %08x\n", dwRetVal );
}
else {
????????printf( "主機名: %s\n", FixedInfo->HostName );
????????printf( "域名: %s\n", FixedInfo->DomainName );
????????
???????? printf("\n==========網絡信息==========\n");
?
???????? // 生成節點類型字符串
???? char* NodeType;
???????? switch(FixedInfo->NodeType)
{
case BROADCAST_NODETYPE:
???????????????? NodeType="Broadcase Node";
???????????????? break;
case PEER_TO_PEER_NODETYPE:
???????????????? NodeType="Peer to Peer Node";
???????????????? break;
case MIXED_NODETYPE:
???????????????? NodeType="Mixed Node";
???????????????? break;
case HYBRID_NODETYPE:
???????????????? NodeType="Hybrid Node";
???????????????? break;
default:
???????????????? NodeType="Unknown Node";
???????????????? break;
}
?
?
????????printf("節點類型...................:%d - %s\n", FixedInfo->NodeType, NodeType);
printf("是否啟用路由功能...........:%s\n", (FixedInfo->EnableRouting != 0) ? "是" : "否");
printf("是否啟用ARP代理功能........:%s\n", (FixedInfo->EnableProxy != 0) ? "是" : "否");
printf("是否啟用DNS服務器..........:%s\n", (FixedInfo->EnableDns != 0) ? "是" : "否");
?
????????printf( "\nDNS服務器列表:\n" );
????????printf( "%s\n", FixedInfo->DnsServerList.IpAddress.String );
?
????????pIPAddr = FixedInfo->DnsServerList.Next;
while ( pIPAddr ) {
????????????printf( "\t%s\n", pIPAddr->IpAddress.String );
????????????pIPAddr = pIPAddr->Next;
}
}
?
????printf("\n\n");
????system("pause");
????return 0;
}
程序運行結果見最后貼圖
4.獲取本地計算機網絡接口的基本信息
編寫使用IP Helper API獲取本地網絡接口信息的程序,代碼如下:
#include "stdafx.h"
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
?
#pragma comment(lib, "iphlpapi.lib")
?
// 分配內存空間
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
// 釋放內存空間
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
?
int _tmain(int argc, _TCHAR* argv[])
{
????// 保存網絡接口信息的結構體指針
PIP_INTERFACE_INFO pInfo;
????// 保存獲取數據的長度
ULONG ulOutBufLen = 0;
????// 返回結果
DWORD dwRetVal = 0;
????// _tmain()函數的返回結果
int iReturn = 1;
?
????// 第1次調用 GetInterfaceInfo,獲取數據大小,保存到ulOutBufLen變量中
dwRetVal = GetInterfaceInfo(NULL, &ulOutBufLen);
if (dwRetVal == ERROR_INSUFFICIENT_BUFFER) {
pInfo = (IP_INTERFACE_INFO *) MALLOC(ulOutBufLen);
if (pInfo == NULL) {
printf("無法分配GetInterfaceInfo函數需要的內存空間。\n");
return 1;
}
}
// 第2次調用GetInterfaceInfo函數,獲取需要的實際數據
dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);
if (dwRetVal == NO_ERROR) {
printf("網絡適配器數量: %ld\n\n", pInfo->NumAdapters);
for (int i = 0; i < (int) pInfo->NumAdapters; i++) {
printf("網絡適配器索引[%d]: %ld\n", i,
pInfo->Adapter[i].Index);
printf("網絡適配器名稱[%d]: %ws\n\n", i,
pInfo->Adapter[i].Name);
}
iReturn = 0;
} else if (dwRetVal == ERROR_NO_DATA) {
printf
("本地計算機上沒有支持IPv4的網絡適配器。\n");
iReturn = 0;
} else {
printf("GetInterfaceInfo調用失敗: %d\n", dwRetVal);
iReturn = 1;
}
????// 釋放內存空間
FREE(pInfo);
// 按任意鍵繼續
????system("pause");
return (iReturn);
}
?
程序運行結果見最后貼圖
5.獲取本地計算機IP地址表
編寫程序調用GetIPAddrTable()函數獲取本地計算機網絡接口和IP地址映射表,程序代碼如下:
#include "stdafx.h"
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
?
#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))
?
int _tmain(int argc, _TCHAR* argv[])
{
???? int i;
?
// 網絡接口與IP地址映射表
PMIB_IPADDRTABLE pIPAddrTable;
????// 獲取數據的大小
DWORD dwSize = 0;
????// 調用GetIPAddrTable()函數的返回值
DWORD dwRetVal = 0;
????// 保存IP地址的結構體
IN_ADDR IPAddr;
// 用于獲取錯誤信息
LPVOID lpMsgBuf;
?
// 分配內存空間
pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));
// 第1次調用GetIpAddrTable()函數,獲取數據的大小到dwSize
if (pIPAddrTable) {
if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==
ERROR_INSUFFICIENT_BUFFER) {
FREE(pIPAddrTable);
pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);
?
}
if (pIPAddrTable == NULL) {
printf("GetIpAddrTable()函數內存分配失敗\n");
exit(1);
}
}
// 第2次調用GetIpAddrTable()函數,獲取實際數據
if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {
????????printf("GetIpAddrTable()調用失敗: %d\n", dwRetVal);
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("\t錯誤信息: %s", lpMsgBuf);
LocalFree(lpMsgBuf);
}
exit(1);
}
?
printf("\t記錄數量: %ld\n", pIPAddrTable->dwNumEntries);
for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {
printf("\n\t接口序號[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex);
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;
printf("\tIP地址[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask;
printf("\t子網掩碼[%d]: \t%s\n", i, inet_ntoa(IPAddr) );
IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr;
printf("\t廣播地址[%d]: \t%s (%ld%)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr);
printf("\t重組報文最大數量[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize);
printf("\t類型和狀態[%d]:", i);
if (pIPAddrTable->table[i].wType & MIB_IPADDR_PRIMARY)
printf("\t主IP地址");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DYNAMIC)
printf("\t動態IP地址");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DISCONNECTED)
printf("\t斷開連接的接口對應的IP地址");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_DELETED)
printf("\t刪除的IP地址");
if (pIPAddrTable->table[i].wType & MIB_IPADDR_TRANSIENT)
printf("\t臨時地址");
printf("\n");
}
?
if (pIPAddrTable) {
FREE(pIPAddrTable);
pIPAddrTable = NULL;
}
?
????printf("\n");
????system("pause");
????return 0;
}
程序運行結果見最后貼圖
?
運行結果
1.使用ipconfig獲取本地網絡信息
2.利用IP Helper API獲取本地網絡適配器信息
3.獲取本地網絡參數的信息的程序
4.使用IP Helper API獲取本地網絡接口信息的程序
5.調用GetIPAddrTable()函數獲取本地計算機網絡接口和IP地址映射表
?
由于win32窗口程序界面完全顯示數據條目比較難實現的關系,采用控制臺程序的方式設計,雖然能夠完成顯示,但是還有待改進。
轉載于:https://www.cnblogs.com/leftshine/p/5698732.html
總結
以上是生活随笔為你收集整理的windows主机网络信息获取程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于《设计模式演练》系列文章结构的规范
- 下一篇: Android NDK的生命周期JNI_