zoukankan      html  css  js  c++  java
  • 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 ", dwRetVal);

        }

        // 从pAdapterInfo 获取并显示本地网络信息

        pAdapter = pAdapterInfo;

        while(pAdapter)

        {

            printf("网络适配器名: %s ", pAdapter->AdapterName);

            printf("网络适配器描述: %s ", pAdapter->Description);

            printf("MAC地址: ");

            for(int i=0; i<pAdapter->AddressLength; i++)

            {

                if(i==(pAdapter->AddressLength -1))

                    printf("%.2X ", (int)pAdapter->Address[i]);

                else

                    printf("%.2X-", (int)pAdapter->Address[i]);

            }

            printf("IP地址: %s ", pAdapter->IpAddressList.IpAddress.String);

            printf("子网掩码: %s ", pAdapter->IpAddressList.IpMask.String);

            printf("网关: %s ", pAdapter->GatewayList.IpAddress.String);

            printf("******************************************************************** ");

            if(pAdapter->DhcpEnabled)

            {

                printf("启用DHCP: 是 ");

                printf("DHCP服务器: %s ", pAdapter->DhcpServer.IpAddress.String);

            }

            else

            {

                printf("启用DHCP: 否 ");

            }

     

            // 处理下一人网络适配器

            pAdapter = pAdapter->Next;

        }

        // 释放资源

        if(pAdapterInfo)

            free(pAdapterInfo);

        

        printf(" ");

        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 ", dwRetVal );

    }

    else {

            printf( "主机名: %s ", FixedInfo->HostName );

            printf( "域名: %s ", FixedInfo->DomainName );

            

             printf(" ==========网络信息========== ");

     

             // 生成节点类型字符串

         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 ", FixedInfo->NodeType, NodeType);

    printf("是否启用路由功能...........:%s ", (FixedInfo->EnableRouting != 0) ? "是" : "否");

    printf("是否启用ARP代理功能........:%s ", (FixedInfo->EnableProxy != 0) ? "是" : "否");

    printf("是否启用DNS服务器..........:%s ", (FixedInfo->EnableDns != 0) ? "是" : "否");

     

            printf( " DNS服务器列表: " );

            printf( "%s ", FixedInfo->DnsServerList.IpAddress.String );

     

            pIPAddr = FixedInfo->DnsServerList.Next;

    while ( pIPAddr ) {

                printf( " %s ", pIPAddr->IpAddress.String );

                pIPAddr = pIPAddr->Next;

    }

    }

     

        printf(" ");

        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函数需要的内存空间。 ");

    return 1;

    }

    }

    // 第2次调用GetInterfaceInfo函数,获取需要的实际数据

    dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);

    if (dwRetVal == NO_ERROR) {

    printf("网络适配器数量: %ld ", pInfo->NumAdapters);

    for (int i = 0; i < (int) pInfo->NumAdapters; i++) {

    printf("网络适配器索引[%d]: %ld ", i,

    pInfo->Adapter[i].Index);

    printf("网络适配器名称[%d]: %ws ", i,

    pInfo->Adapter[i].Name);

    }

    iReturn = 0;

    } else if (dwRetVal == ERROR_NO_DATA) {

    printf

    ("本地计算机上没有支持IPv4的网络适配器。 ");

    iReturn = 0;

    } else {

    printf("GetInterfaceInfo调用失败: %d ", 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()函数内存分配失败 ");

    exit(1);

    }

    }

    // 第2次调用GetIpAddrTable()函数,获取实际数据

    if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {

            printf("GetIpAddrTable()调用失败: %d ", 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(" 错误信息: %s", lpMsgBuf);

    LocalFree(lpMsgBuf);

    }

    exit(1);

    }

     

    printf(" 记录数量: %ld ", pIPAddrTable->dwNumEntries);

    for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {

    printf(" 接口序号[%d]: %ld ", i, pIPAddrTable->table[i].dwIndex);

    IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;

    printf(" IP地址[%d]: %s ", i, inet_ntoa(IPAddr) );

    IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask;

    printf(" 子网掩码[%d]: %s ", i, inet_ntoa(IPAddr) );

    IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr;

    printf(" 广播地址[%d]: %s (%ld%) ", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr);

    printf(" 重组报文最大数量[%d]: %ld ", i, pIPAddrTable->table[i].dwReasmSize);

    printf(" 类型和状态[%d]:", i);

    if (pIPAddrTable->table[i].wType & MIB_IPADDR_PRIMARY)

    printf(" 主IP地址");

    if (pIPAddrTable->table[i].wType & MIB_IPADDR_DYNAMIC)

    printf(" 动态IP地址");

    if (pIPAddrTable->table[i].wType & MIB_IPADDR_DISCONNECTED)

    printf(" 断开连接的接口对应的IP地址");

    if (pIPAddrTable->table[i].wType & MIB_IPADDR_DELETED)

    printf(" 删除的IP地址");

    if (pIPAddrTable->table[i].wType & MIB_IPADDR_TRANSIENT)

    printf(" 临时地址");

    printf(" ");

    }

     

    if (pIPAddrTable) {

    FREE(pIPAddrTable);

    pIPAddrTable = NULL;

    }

     

        printf(" ");

        system("pause");

        return 0;

    }

    程序运行结果见最后贴图

     

    运行结果

    1.使用ipconfig获取本地网络信息

    2.利用IP Helper API获取本地网络适配器信息

    3.获取本地网络参数的信息的程序

    4.使用IP Helper API获取本地网络接口信息的程序

    5.调用GetIPAddrTable()函数获取本地计算机网络接口和IP地址映射表

     

    由于win32窗口程序界面完全显示数据条目比较难实现的关系,采用控制台程序的方式设计,虽然能够完成显示,但是还有待改进。

  • 相关阅读:
    12.SolrCloud原理
    11.SolrCloud集群环境搭建
    10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)
    9.Solr4.10.3数据导入(post.jar方式和curl方式)
    Java程序设计之最大公约数和最小公倍数
    Java程序设计之正则表达式
    Java程序设计之整数分解
    Java程序设计之裴波拉切那数列(兔子一年的数量)
    Java并发编程实例(synchronized)
    Java程序设计之合租房synchronized(二)
  • 原文地址:https://www.cnblogs.com/leftshine/p/5698732.html
Copyright © 2011-2022 走看看