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窗口程序界面完全顯示數據條目比較難實現的關系,采用控制台程序的方式設計,雖然能夠完成顯示,但是還有待改進。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM