还剩5页未读,继续阅读
文本内容:
西安财经学院信息学院《网络程序设计》实验报告实验名称获取主机网卡信息和子网掩码实验室实验楼402实验日期
一、实验目的了解如何编写程序实现获取本地主机的网卡信息和子网掩码实验要求获得本地计算机的网络信息,从而获得计算机的网卡名、网卡驱动程序、IP地址、子网掩码、物理地址、是否启用了DHCP、是否启用了WINS等网络信息实验内容利用GetAdaptersInfo函数获取计算机的网络信息实验原理在TCP/IP协议中,子网掩码是用来区分网络上的主机是否在同一网络段内的假如某主机的IP地址为
202.
119.
115.78,它的子网掩码为
255.
255.
255.0,将这两个数据做AND运算,则所得的值中非零的部分即为网络ID运算步骤如下 1IP地址
202.
119.
115.78的二进制值为1_____
10.
01110111.
01110011.01001110 2子网掩码
255.
255.
255.0的二进制值为
11111111.
11111111.
11111111.000000003将两者做AND计算,其结果为1_____
10.
01110111.
01110011.000000004将结果转换成十进制后为
202.
119.
115.0,其非零部分
202.
119.115就是网络ID,在IP地址中剩下的为主机ID,本例中为78这样如果另一台主机的IP地址为
202.
119.
115.83,其子网掩码为
255.
255.
255.0,则其网络ID为
202.
119.115,主机ID为83因为这两台主机的网络ID均为
202.
119.115,因此这两台主机在同一网段内函数GetAdaptersInfo可以获得本地计算机的网络信息,从而获得该计算机的网卡名、网卡驱动程序、IP地址、子网掩码、物理地址、是否启用了DHCP、是否启用了WINS等网络信息注意该函数在头文件IpHlpApi.h中声明,库文件为IpHlpApi.lib函数原型为 DWORDGetAdaptersInfoPIP_ADAPTER_INFOpAdapterInfoPULONGpOutBufLen;其中 参数pAdapterInfo指向IP_ADAPTER_INFO结构链表缓冲区的指针; 参数pOutBufLen指向一个ULONG变量的指针,该ULONG变量表示指向pAdapterInfo结构的大小 参数中的IP_ADAPTER_INFO结构包含了本地计算机上一个特定网络适配卡的信息,该结构格式如下typedefstruct_IP_ADAPTER_INFO{struct_IP_ADAPTER_INFO*Next;//指向链表中下一个适配器信息的指针DWORDComboIndex;//预留值charAdapterName[__X_ADAPTER_NAME_LENGTH+4];//使用ANSI字符串表示的适配器名称charDescription[__X_ADAPTER_DESCRIPTION_LENGTH+4];//使用ANSI字符串表示的适配器描述UINTAddressLength;//适配器硬件地址以字节计算的长度BYTEAddress[__X_ADAPTER_ADDRESS_LENGTH];//硬件地址以BYTE数组所表示DWORDIndex;//适配器索引UINTType;//适配器类型UINTDhcpEnabled;//指定这个适配器是否开启DHCPPIP_ADDR_STRINGCurrentIpAddress;//预留值IP_ADDR_STRINGIpAddressList;//该适配器的IPv4地址链表IP_ADDR_STRINGGatewayList;//该适配器的__IPv4地址链表IP_ADDR_STRINGDhcpServer;//该适配器的DHCP服务器的IPv4地址链表BOOLH__eWins;IP_ADDR_STRINGPri__ryWinsServer;IP_ADDR_STRINGSecondaryWinsServer;time_tLeaseObtained;time_tLeaseExpires;}IP_ADAPTER_INFO*PIP_ADAPTER_INFO;其中成员变量的具体含义如下 Next链表指针域,通过这个变量来遍历静态链表 ComboIndex保留未用 AdapterName[__X_ADAPTER_NAME_LENGTH+4]网卡名 Description[__X_ADAPTER_DESCRIPTION_LENGTH+4]对网卡的描述,实际上是驱动程序的名字 AddressLength物理地址的长度,通过该变量才能正确地显示下面数组中的物理地址 Address[__X_ADAPTER_ADDRESS_LENGTH]物理地址,每个字节存放一个十六进制的数值 Index网卡索引号Type网卡类型 DhcpEnable是否启用了DHCP动态IP分配 CurrentIpAddress当前使用的IP地址 IpAddressList绑定到此网卡的IP地址链表 GetwayList__地址链表 DhcpServer DHCP服务器地址,只有在“DhcpEnable==TRUE”时才有效 H__eWins是否启用了WINS Pri__ryWinsServer主WINS地址 SecondaryWinsServer辅WINS地址LeaseObtained当前DHCP租借获取的时间 LeaseExpires当前DHCP租借失效的时间 LeaseObtained和LeaseExpires这两个数据结构只有在启动了DHCP时才有效该结构成员变量Pri__ryWinsServer和SecondaryWinsServer的类型IP_ADDR_STRING结构代表IP地址链表的一个节点,其定义如下该结构表示IP地址链表即一组IP地址typedefstruct_IP_ADDR_STRING{struct_IP_ADDR_STRING*Next;IP_ADDRESS_STRINGIpAddress;IP___SK_STRINGIp__sk;DWORDContext;}IP_ADDR_STRING;字段说明:Next:指向表中的下一个IP_ADDR_STRING结构IpAddress一个字符串,它描述了点分十进制IP地址Ip__sk与上面的IpAddress关联的IP地址掩码Context网络表入口实验步骤利用VisualC++创建工程时,选择Win32ConsoleApplication,程序运行之后是个DOS模式界面为了利用GetAdaptersInfo函数获取计算机的网络信息,必须在创建的工程中添加入头文件IpHlpApi.h、IpExport.h、IpTypes.h、Iprtrmib.h和库文件IpHlpApi.lib具体的实现代码如下#includewinsock
2.h#includeIphlpapi.h#includestdio.h#prag__commentlibIphlpapi.libint__in{PIP_ADAPTER_INFOpAdapterInfo;//pAdapterInfo指向结构体_IP_ADAPTER_INFO的指针PIP_ADAPTER_INFOpAdapter=NULL;//pAdapter指向结构体_IP_ADAPTER_INFO的指针为空DWORDdwRetVal=0;ULONGulOutBufLen;pAdapterInfo=PIP_ADAPTER_INFO__llocsizeofIP_ADAPTER_INFO;//pAdapterInfo指向IP_ADAPTER_INFO结构链表缓冲区的指针;__lloc向系统申请分配指定size个字节的内存空间返回类型是void*类型void*表示未确定类型的指针ulOutBufLen=sizeofIP_ADAPTER_INFO;//结构体大小//第一次调用GetAdapterInfo获取ulOutBufLen大小ifGetAdaptersInfopAdapterInfoulOutBufLen==ERROR_BUFFER_OVERFLOW//Thereisnotenoughspa__onthedisk.{freepAdapterInfo;//释放内存空间pAdapterInfo=IP_ADAPTER_INFO*__lloculOutBufLen;//pAdapterInfo指向IP_ADAPTER_INFO结构链表缓冲区的指针;}ifdwRetVal=GetAdaptersInfopAdapterInfoulOutBufLen==NO_ERROR{pAdapter=pAdapterInfo;HKEYhKEY;//要查询的键的句柄whilepAdapter{printfAdapterName:\t%s\npAdapter-AdapterName;//////////////////////////////////////////////////////////////////////////////////////charpath[__X_PATH]=\0;sprintfpathSYSTEM\\ControlSet001\\Control\\Network\\{4D36E972-E325-11__-BFC1-08002BE10318}\\%s\\ConnectionpAdapter-AdapterName;//打开一个指定的注册表键longret=::RegOpenKeyExHKEY_LOCAL___CHINEpath0KEY_READhKEY;//指向一个被打开键返回的句柄的指针ifret!=ERROR_SUC__SS//如果无法打开hKEY,则终止程序的执行{printfError!\n;return0;}//找回所打开注册表键所关联的一个给定值的类型和数据unsignedchartmp
[256]=\0;DWORDtype=REG_SZ;DWORDsize=80;ret=::RegQueryValueExhKEYNameNULLtypetmpsize;ifret!=ERROR_SUC__SS{printfError!\n;return0;}::Re__loseKeyhKEY;//释放指定注册键的句柄函数printfAdapterChineseName:\t%s\ntmp;//////////////////////////////////////////////////////////////////////////////////////printfAdapterDesc:\t%s\npAdapter-Description;printf__CAddr:\t%02x-%02x-%02x-%02x-%02x-%02x\n//%02x,不足两位前面补零pAdapter-AddresspAdapter-AddresspAdapter-AddresspAdapter-AddresspAdapter-AddresspAdapter-Address;printfIPAddress:\t%s\npAdapter-IpAddressList.IpAddress.String;printfIP__sk:\t%s\npAdapter-IpAddressList.Ip__sk.String;printfGateway:\t%s\npAdapter-GatewayList.IpAddress.String;pAdapter=pAdapter-Next;}}else{printfCalltoGetAdaptersInfofailed.\n;}systempause;return0;}运行结果实验总结姓名学号班级年级指导教师。