您的位置:首页 > 理论基础 > 计算机网络

windows主机网络信息获取程序设计

2016-07-23 15:02 513 查看
掌握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窗口程序界面完全显示数据条目比较难实现的关系,采用控制台程序的方式设计,虽然能够完成显示,但是还有待改进。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: