您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > windows网络编程第6章
Windows网络编程实用教程授课教师:职务:第6章探测网络中的在线设备课程描述要对一个网络进行管理,首先应该知道网络中包括哪些设备和这些设备的在线状态。通常应用程序从获取本地网络信息开始,计算本地子网中包含的所有可能的IP地址,然后使用类似ping命令的功能来发现本地网络。本章将介绍获取本地网络信息和探测网络中在线设备的方法。本章知识点获取本地计算机的网络信息扫描子网中的地址6.1获取本地计算机的网络信息6.1.1使用ipconfig命令获取本地网络信息6.1.2获取本地网络信息的开发接口IPHelperAPI6.1.3获取本地网络适配器信息6.1.4获取本地主机名、域名和DNS服务器信息6.1.5获取本地计算机网络接口的基本信息6.1.6获取本地计算机IP地址表6.1.7添加和删除IP地址6.1.1使用ipconfig命令获取本地网络信息在Windows操作系统中,可以使用ipconfig命令获取本地网络信息。在命令窗口中执行ipconfig命令。查看详细网络信息执行下面的命令:ipconfig/all6.1.2获取本地网络信息的开发接口IPHelperAPIIPHelperAPI可以实现的主要功能如下:获取网络配置的信息。管理网络适配器(NetworkAdapter),也就是通常所说的网卡,它位于数据链路层。管理网络接口(Interface)。接口表示节点上对应连接的部分,它位于IP层,因此可以在接口上绑定IP地址。在IPHelperAPI中,网络适配器和接口是一一对应的。管理IP地址。使用ARP协议。获取IP和ICMP协议中的信息。管理路由信息。接收网络事务的通知信息。接收TCP和UDP信息。引用IPHELPAPI.lib在VisualC++项目中,可以使用下面的语句引用IPHELPAPI.lib。#pragmacomment(lib,IPHLPAPI.lib)也可以在项目属性对话框中选择“配置属性”/“链接器”/“输入”,然后在右侧的“附加依赖项”中输入IPHLPAPI.lib。6.1.3获取本地网络适配器信息在iphlpapi.h中声明了GetAdaptersInfo()函数,调用该函数可以返回本地网络适配器的基本信息,语法如下:DWORDGetAdaptersInfo(PIP_ADAPTER_INFOpAdapterInfo,PULONGpOutBufLen);结构体IP_ADAPTER_INFO在iptypes.h中声明,定义代码如下:typedefstruct_IP_ADAPTER_INFO{struct_IP_ADAPTER_INFO*Next;DWORDComboIndex;charAdapterName[MAX_ADAPTER_NAME_LENGTH+4];charDescription[MAX_ADAPTER_DESCRIPTION_LENGTH+4];UINTAddressLength;BYTEAddress[MAX_ADAPTER_ADDRESS_LENGTH];DWORDIndex;UINTType;UINTDhcpEnabled;PIP_ADDR_STRINGCurrentIpAddress;IP_ADDR_STRINGIpAddressList;IP_ADDR_STRINGGatewayList;IP_ADDR_STRINGDhcpServer;BOOLHaveWins;IP_ADDR_STRINGPrimaryWinsServer;IP_ADDR_STRINGSecondaryWinsServer;time_tLeaseObtained;time_tLeaseExpires;}IP_ADAPTER_INFO,*PIP_ADAPTER_INFO;结构体IP_ADAPTER_INFO中定义的成员变量成员变量说明Next指定网络适配器链表中的下一个网络适配器ComboIndex预留变量AdapterName网络适配器的名称Description网络适配器的描述信息AddressLength网络适配器MAC地址的长度Address网络适配器的MAC地址Index网络适配器索引。当一个网络适配器被禁用然后又重新启用后,该适配器的索引将发生变化。因此该值并不是网络适配器的唯一标识Type网络适配器的类型,包括MIB_IF_TYPE_OTHER、MIB_IF_TYPE_ETHERNET、MIB_IF_TYPE_TOKENRING、MIB_IF_TYPE_FDDI、MIB_IF_TYPE_PPP、MIB_IF_TYPE_LOOPBACK和MIB_IF_TYPE_SLIP等。这些值在IPIfCons.h中定义DhcpEnabled指定该网络适配器上是否启用了DHCP协议CurrentIpAddress预留变量IpAddressList与此网络适配器相关联的IP地址列表GatewayList该网络适配器上定义的IP地址的默认网关DhcpServer该网络适配器上定义的DHCP服务器的IP地址HaveWins标明该网络适配器是否启用了WINSPrimaryWinsServer主WINS服务器的IP地址SecondaryWinsServer从WINS服务器的IP地址LeaseObtained当前的DHCP租借获取的时间,只有在启用DHCP时生效LeaseExpires当前的DHCP租借失效的时间,只有在启用DHCP时生效【例6.1】通过一个实例来介绍如何使用VisualC++编写获取本地网络信息的程序。实例是一个控制台项目。1.声明头文件在GetIPConfig.cpp中需要声明程序中使用的头文件,并引用IPHLPAPI.lib,代码如下:#includestdafx.h#pragmacomment(lib,IPHLPAPI.lib)#includewinsock2.h#includeiphlpapi.h#includestdio.h2.声明变量在主函数_tmain()中,首先需要声明程序中使用的变量,代码如下://指定获取到的网络信息结构体链表的指针IP_ADAPTER_INFO*pAdapterInfo;//保存获取到的网络信息结构体链表的长度ULONGulOutBufLen;//返回调用编码DWORDdwRetVal;//在轮循所有网络适配器信息时使用的单个结构体变量PIP_ADAPTER_INFOpAdapter;3.获取本地网络适配器信息在获取本地信息的过程中,需要两次调用GetAdaptersInfo()函数。第1次调用可以获取返回数据的大小,第2次调用使用前面获取到的数据大小作为参数,获取实际的IP_ADAPTER_INFO结构体内容,具体代码如下://为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(GetAdaptersInfoError!%d\n,dwRetVal);}4.显示本地网络适配器信息现在本地网络信息已经读取到pAdapterInfo链表中,因为本地计算机上可能安装多个网络适配器,所以需要使用While语句循环处理pAdapterInfo链表中的每个IP_ADAPTER_INFO结构体,并显示其中的网络信息,代码如下://从pAdapterInfo获取并显示本地网络信息pAdapter=pAdapterInfo;while(pAdapter){printf(网络适配器名:\t\t%s\n,pAdapter-AdapterName);printf(网络适配器描述:\t%s\n\n,pAdapter-Description);printf(MAC地址:\t\t);//处理MAC地址for(inti=0;ipAdapter-AddressLength;i++){if(i==(pAdapter-AddressLength-1))printf(%.2X\n,(int)pAdapter-Address[i]);elseprintf(%.2X-,(int)pAdapter-Address[i]);}……4.显示本地网络适配器信息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;}5.释放资源处理完成后,需要将释放到pAdapter链表所占用的内存空间,代码如下://释放资源if(pAdapterInfo)free(pAdapterInfo);6.暂停程序,等待用户响应在显示本地网络信息后,程序处于暂停状态,等待用户响应,代码如下:printf(\n\n);system(pause);return0;system(pause);语句的功能是暂停系统的工作,并在控制台输出“按任意键继续…”。用户按任意键后,程序继续运行,执行return0;语句退出_tmain()函数。6.1.4获取本地主机名、域名和DNS服务器信息调用GetNetworkParams()函数可以返回本地的网络参数信息,包括本地的主机名、域名和DNS服务器列表等。GetNetworkParams()函数的语法如下:DWORDGetNetworkParams(__outPFIXED_INFOpFixedInfo,__inPULONGpOutBufLen);参数pFixedInfo是输出参数,它是一个指向缓冲区的指针,缓冲区中使用FIXED_INFO结构体保存获取到的本地网络参数信息;参数pOutBufLen是一个指向ULONG变量的指针,保存pFixedInfo缓冲区的大小。PFIXED_INFOPFIXED_INFO是指定结构体FIXED_INFO的指针,它在iptypes.h中声明,定义代码如下:typedefstruct{charHostName[MAX_HOSTNAME_LEN+4];charDomainName[MAX_DOMAIN_NAME_LEN+4];PIP_ADDR_STRINGCurrentDnsServer;IP_ADDR_STRINGDnsServerList;UINTNodeType;charScopeId[
本文标题:windows网络编程第6章
链接地址:https://www.777doc.com/doc-2867682 .html