掌握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窗口程序界面完全显示数据条目比较难实现的关系,采用控制台程序的方式设计,虽然能够完成显示,但是还有待改进。

windows主机网络信息获取程序设计的更多相关文章

  1. Qt-获取主机网络信息之QHostInfo

    Qt中提供了几个用于获取主机网络信息的类,包括QHostInfo.QHostAddress.QNetworkInterface以及QNetworkAddress.在本节中,我将在这里总结QHostIn ...

  2. c/c++ 网络编程 UDP 用if_nameindex和ioctl取得主机网络信息

    网络编程 UDP 用if_nameindex和ioctl取得主机网络信息 getifaddrs函数取得的东西太多了,如果只想取得网卡名字和网卡编号可以用下面的2个函数. 1,if_nameindex ...

  3. c/c++ 网络编程 UDP 主机网络信息取得

    网络编程 UDP 主机网络信息取得 1,if_nametoindex 通过网卡名字取得网卡编号 2,if_indextoname 通过网卡编号取得网卡名字 #include <stdio.h&g ...

  4. Qt-获取主机网络信息之QNetworkInterface

    QNetworkInterface类提供了一个主机IP地址和网络接口的列表. QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口.每个网络接口可能包含0个或者多个IP地 ...

  5. Qt-获取主机网络信息之QHostAddress

    QHostAddress类提供一个IP地址. 这个类提供一种独立于平台和协议的方式来保存IPv4和IPv6地址. QHostAddress通常与QTcpSocket,QTcpServer,QUdpSo ...

  6. Qt-获取主机网络信息之QNetworkAddressEntry

    QNetworkAddressEntry类存储了一个网络接口所支持的一个IP地址,同时还有与之相关的子网掩码和广播地址. 每个网络接口可以包含0个或多个IP地址,这些IP地址可以分别关联一个子网掩码和 ...

  7. Windows主机与centOS虚拟机之间"ping不通"

    为什么要遇到这个问题 这是我重新安装centOS7.5虚拟机之后遇到的问题——我需要安装一个SecureCRT工具,结果主机与虚拟机没有ping通. 在安装这个工具之前需要进行主机与虚拟机的相互pin ...

  8. 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化

    [源码下载] 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...

  9. 获取主机信息,网络信息AIP,getsockname,getpeername,getservbyname,getservbyport,inet_ntop,inet_pton

    获取主机信息 1.ip地址转换,主机字节序 <---> 网络字节序 #include <arpa/inet.h> int inet_pton(int af, const cha ...

随机推荐

  1. 5.python内置函数详解

    内置函数 声明,转载至这位大哥,感谢之至 http://blog.csdn.net/oaa608868/article/details/53506188 关于分类 数学运算(7个) 类型转换(24个) ...

  2. [JavaScript] 获取数组中相同元素的个数

    /** * 获取数组中相同元素的个数 * @param val 相同的元素 * @param arr 传入数组 */ function getSameNum(val,arr){ processArr ...

  3. 【wireshark】抓包和文件格式支持

    1. 抓包 捕获从网络适配器提取包,并将其保存到硬盘上. 访问底层网络适配器需要提升的权限,因此和底层网卡抓包的功能被封装在dumpcap中,这是Wireshark中唯一需要特权执行的程序,代码的其他 ...

  4. java对象的结构

    [Java对象解析]不得不了解的对象头 一个Java对象到底占用多大内存? JVM源码分析之java对象头实现 java对象在内存中的结构(转帖) 一个Java对象到底占多大内存? 在Hotspot ...

  5. JMeter性能测试-服务器资源监控插件详解

          零.引言 我们对被测应用进行性能测试时,除了关注吞吐量.响应时间等应用自身的表现外,对应用运行所涉及的服务器资源的使用情况,也是非常重要的方面,通过实时监控,可以准确的把握不同测试场景下服 ...

  6. 【xsy1214】 异或路径(xorpath) 点分治+可持久化trie

    题目大意:给你一棵$n$个点的树,每个点有一个点权$x$,问你所有路径中点权异或和最大的路径的异或和 数据范围:$n≤30000$,$x≤2^{31}-1$. 如果是边上有点权的话非常简单,直接一个$ ...

  7. XCode9的新变化

    XCode9已经随着ios11的发布发布了,那么在这个XCode9版本中有哪些变化呢? 1 折叠代码 焦点在方法的实现体的方法名上,按comman键,则整个函数会被框住.用来标志这个方法的起点和终点 ...

  8. POJ 2377

    #include<stdio.h> #define MAXN 1005 #include<iostream> #include<algorithm> #define ...

  9. openerp学习笔记 视图(tree\form)中隐藏按钮( 创建、编辑、删除 ),tree视图中启用编辑

    视图(tree\form)中隐藏按钮( 创建.编辑.删除 )create="false" edit="false" delete="false&quo ...

  10. Netty核心概念(8)之Netty线程模型

    1.前言 第7节初步学习了一下Java原本的线程池是如何工作的,以及Future的为什么能够达到其效果,这些知识对于理解本章有很大的帮助,不了解的可以先看上一节. Netty为什么会高效?回答就是良好 ...