《IP地址合法性判断及子网检测 大学课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《IP地址合法性判断及子网检测 大学课程设计实验报告.docx(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、IP地址合法性判断及子网检测 大学课程设计实验报告 四川理工学院 实验报告 实验名称IP地址合法性判断及子网检验课程名称计算机科学与技术 姓名成绩 班级学号 日期2022年1月 地点 计算机学院 一. 实验目的 本设计要求编辑写程序,判断一个ip地址是否合法,并判断该地址是否属于一个给定子网,从而考察读者是否对ip地址概念及其子网划分有非常清楚的认识。 1加深对IP地址及subnet的认识; 2了解IP地址的划分; 3. 了解subnet的作用和产生因素,subnet的划分; 4. 实际操作编写规则,匹配IP和subnet,加深理解 二. 设计要求 在掌握ip地址表示方法及子网划分方法的基础上
2、,按如下要求完成程序。 1:命令格式:ip_test subnet/mask ip_addr 其中,ip_test为程序名;subnet为子网号,mask是一个数值,代表子网掩码连续1的个数,ip_addr是要测试的ip地址。 2:判断subnet和ip_addr的合法性。 在判断ip地址合法性时要自行编代码,不要使用任何inet函数。判断时要考虑全面。 3:判断掩码的合法性。 4:在ip地址合法的前提下,判断ip_addr是否属于子网subnet。 5:输出命令行中的ip是否合法,掩码是否合法,以及ip_addr是否属于子网subnet. 三. 实验环境(软件、硬件及条件) 1软件 操作系统
3、:Windows xp(Windows NT以上版本皆可) 编程环境:Microsoft Visual Studio 2022(兼容MS VS2022,亦可使用等)编程语言:C+ 测试环境: MS-DOS 2硬件 现阶段常见PC 四. 实验方法 Part 1实验原理 我们说过因特网是把全世界的无数个网络连接起来的一个庞大的网间网,每个网络中的计算机通过其自身的IP地址而被唯一标识的,据此我们也可以设想,在Internet上这个庞大的网间网中,每个网络也有自己的标识符。我们把计算机的IP地址也分成两部分,分别为网络标识和主机标识。同一个物理网络上的所有主机都用同一个网络标识,网络上的一个主机(包
4、括网络上工作站、服务器和路由器等)都有一个主机标识与其对应IP地址的4个字节划分为2个部分,一部分用以标明具体的网络段,即网络标识;另一部分用以标明具体的节点,即主机标识,也就是说某个网络中的特定的计算机号码。另一方面,只有在一个网络号下的计算机之间才能直接互通,不同网络号的计算机要通过网关(Gateway)才能互通。但这样的划分在某些情况下显得并十分不灵活。为此IP网络还允许划分成更小的网络,称为子网(Subnet),这样就产生了子网掩码 1. IP的寻址规则 (1).ip分类规则 a、网络地址必须唯一。 b、网络标识不能以数字127开头。在A类地址的第一位为0,数字127保留给内部回送函数
5、。 B类地址的前两位为10;C类地址的前三位为110;D类地址的前四位为 1110;E类地址的前五位为 11110。 c、网络标识的第一个字节不能为255。数字255作为广播地址。 d、网络标识的第一个字节不能为“0”,“0”表示该地址是本地主机,不能传送。 e、不合法的IP地址类型: 123. $. 2.主机寻址规则 a、主机标识在同一网络内必须是唯一的。 b、主机标识的各个位不能都为“1”,如果所有位都为“1”,则该机地址是广播地址,而非主机的地址。 c、主机标识的各个位不能都为“0”,如果各个位都为“0”,则表示“只有这个网络”,而这个网络上没有任何主机。 3.确定子网掩码数 用于子网掩
6、码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。 定义子网掩码的步骤为: a、确定哪些组地址归我们使用。比如我们申请到的网络号为“128B类IP 地址,网络标识为“128.73”,主机标识为“”。 b、根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们现在需要12个子网,将来可能需要16个。用第三个字节的前四位确定子网掩码。前四位都置为“1”,即第三个字节为“,这个数我们暂且称作新的二进制子网掩码。 c、把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0” d、把
7、这个数转化为间断十进制形式为:“.240.0” 这个数为该网络的子网掩码。 掩码的标注 A、无子网的标注法 B、有子网的标注法 有子网时,一定要二者配对出现。以C类地址为例。IP地址中的前3个字节表示网络号,后一个字节既表明子网号,又说明主机号,还说明两个IP地址是否属于一个网段。如果属于同一网络区间,这两个地址间的信息交换就不通过路由器。如果不属同一网络区间,也就是子网号不同,两个地址的信息交换就要通过路由器进行。例如:假设maskwe为27,;2 Part 2具体实现 通过以上的原理,我们就知道了在检验IP地址和子网检验时应该明确的问题,关键的两点就是把输入的IP分解成各段,然后判断子网号
8、,掩码和ip地址的基本格式是否合法, 其次:如果三者的基本格式都合法,才调用断定,ip地址是否为子网成员,的函数。该函数同时判别子网号与掩码是否匹配,子网号为全0或全1,主机号为全0、全1。 1.实现流程 2. 编程 本部分的编程的主要目的是算法的实现,主要的方法是C+中字符串处理。 (1)类设计 a.属性 char ip15; 法 构造函数,析构函数: ipTest(char *,char *); 取参数 2.简单判断参数格式(长度) 3.若是正常参数,实例化 ipTest 类 4.调用主判断函数void AllJudgment() 判断 5.输出结果 (3)程序流程 (4)头文件 #inc
9、lude #include #include #include #include #include using namespace std; 五. 实验分析及测试 本部分测试了正常输入和非法输入时,程序对输入的判断,编程的环境为VS2022,在解决方案文件夹下面的Debug 文件夹里面生成可执行文件;运行MS-DOS ,进入Debug 文件夹进行测试。 1.算法正确性检测 (1)用正确格式和合法的数据的输入,测试Mask 和IP 的匹配 Mask:15和 16 结果截图: (2)用正确格式和合法的数据的输入,测试主网和子网的匹配 Mask:18 所以可知: 0010 1100 2位相于,得:0
10、0 M0000 0000 2位相于,得:01 0111 0001 结果为不匹配。 截图: 0010 1100 2位相于,得:00 M0000 0000 2位相于,得:00 0011 0001 结果为匹配。 截图: (3)补充说明: ii)考虑(2) 2.输入合法性测试 本实验程序规定输入的标准参数输入,其中:X为0-255的十进制整数,mask为0-32的十进制整数,两个IP地址中间用空格分开,IP地址的为4段,每一段都用“.”分开,IP地址中允许出现空格或其他字符 (1)输入的IP地址中含有非法字符 测试数据: a2 子网IP:12e Mask:1h 结果截图: (2)输入的IP地址段数不正
11、确 测试数据:主网IP:128. 子网IP:. Mask:18 结果截图: (3)没有输入mask .11 结果截图: (4)输入mask超出合法范围 Mask:35 结果截图: (5)输入IP超出合法范围 Mask:25 结果截图: (6)特殊的IP地址 测试数据:主网IP:0.0.0.0 Mask:0 结果截图: 测试数据:主网IP:0.0.0.0 Mask:0 结果截图: 六. 实验结论 本实验根据现在通用的IP地址分配使用规则,设计实验算法,运用C+字符转函数处理,程序实现了基本要求的功能,考虑到了多方面的因素;另一方面,设计之初的思路把此程序定位在接口工具程序,所以省略掉UI的设计,
12、考虑到了扩展性的方面需要,程序提供简单、方便的接口和较为简单参数,方便扩展使用。 仍存在的问题:数据结构的设计不够清晰简练和方便使用,可读性不太好; 主函数流程存在一定的问题,理路不是很清晰,主要是类的各个方法的设计没有总体考虑,设计之初没有考虑,在需要时才加,导致程序结构有点乱,不易阅读和检查。 七. 附录源代码 说明: 源文件语言:C+ 文件数:1 源文件名: #include #include #include #include #include #include using namespace std; ; char *token,*dot4; int iplen=0; token=s
13、trtok(chaddr,ch); while(token!=NULL) dotiplen=token; addriplen=atoi(dotiplen); char ip_one18; strcpy(ip_one,ip); char *token,*dot4; int iplen=0; 是否正确*/ int j,t=0; for(j=0;j255) if(!NoIllegalChar(doti) /判断含有非法字符 cout255) /判断数值溢出 cout0&atoi(dot0)=128&atoi(dot0)=192&atoi(dot0)223&atoi(dot0)255) cout请重新
14、输入ip地址ip,仅限于A,B和C类ip地址,error!endl; return false; /* if(atoi(dot0)=255) coutip地址ip网络号全为,error!endl; return false; */ j2=j1; /j1用于判断全情况,j1用于判断全情况的起始下标 int flag=1;/首先设置为非法,即主机号全 for(i=j1;iiplen;i+) if(atoi(doti)!=0) flag=0; if(flag=1) coutip地址ip的主机号全,error!endl; return false; flag=1;/首先设置为非法,即全 for(i=j
15、2;iiplen;i+) if(atoi(doti)!=255) flag=0; if(flag=1) coutip地址ip的主机号全,error!endl; return false; return true; /判断子网号subnet是否合法 bool ipTest:subnetIsValid(char *subnet) if(!ipIsValid(subnet) /调用判断Ip的函数ipIsValid()进行判断 return false; return true; /判断ip是否为子网成员,并输出判断结果 void ipTest:print() char subnet_one15,ip_one15; int nbip4,nbsubnet4,i;