




免费预览已结束,剩余18页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
四川理工学院实 验 报 告实验名称IP地址合法性判断及子网检验课程名称计算机科学与技术姓名成绩班级学号日期2013年1月地点计算机学院一. 实验目的本设计要求编辑写程序,判断一个ip地址是否合法,并判断该地址是否属于一个给定子网,从而考察读者是否对ip地址概念及其子网划分有非常清楚的认识。1加深对IP地址及subnet的认识;2了解IP地址的划分;3. 了解subnet的作用和产生因素,subnet的划分;4. 实际操作编写规则,匹配IP和subnet,加深理解二. 设计要求在掌握ip地址表示方法及子网划分方法的基础上,按如下要求完成程序。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软件操作系统:Windows xp(Windows NT以上版本皆可)编程环境:Microsoft Visual Studio 2008(兼容MS VS2005,亦可使用VC6.0等)编程语言:C+测试环境: MS-DOS2硬件现阶段常见PC四. 实验方法Part 1 实验原理我们说过因特网是把全世界的无数个网络连接起来的一个庞大的网间网,每个网络中的计算机通过其自身的IP地址而被唯一标识的,据此我们也可以设想,在Internet上这个庞大的网间网中,每个网络也有自己的标识符。我们把计算机的IP地址也分成两部分,分别为网络标识和主机标识。同一个物理网络上的所有主机都用同一个网络标识,网络上的一个主机(包括网络上工作站、服务器和路由器等)都有一个主机标识与其对应IP地址的4个字节划分为2个部分,一部分用以标明具体的网络段,即网络标识;另一部分用以标明具体的节点,即主机标识,也就是说某个网络中的特定的计算机号码。另一方面,只有在一个网络号下的计算机之间才能直接互通,不同网络号的计算机要通过网关(Gateway)才能互通。但这样的划分在某些情况下显得并十分不灵活。为此IP网络还允许划分成更小的网络,称为子网(Subnet),这样就产生了子网掩码1. IP的寻址规则 (1).ip分类规则 a、 网络地址必须唯一。 b、 网络标识不能以数字127开头。在A类地址的第一位为0,数字127保留给内部回送函数。 B类地址的前两位为10;C类地址的前三位为110;D类地址的前四位为 1110;E类地址的前五位为 11110。c、 网络标识的第一个字节不能为255。数字255作为广播地址。 d、 网络标识的第一个字节不能为“0”,“0”表示该地址是本地主机,不能传送。e、不合法的IP地址类型:123.2.1123.23$.2.1123.2345.2.1123.23.45.1 2.主机寻址规则 a、主机标识在同一网络内必须是唯一的。 b、主机标识的各个位不能都为“1”,如果所有位都为“1”,则该机地址是广播地址,而非主机的地址。 c、主机标识的各个位不能都为“0”,如果各个位都为“0”,则表示“只有这个网络”,而这个网络上没有任何主机。3.确定子网掩码数 用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。 定义子网掩码的步骤为: a、确定哪些组地址归我们使用。比如我们申请到的网络号为 “128.73.a.b”,该网络地址为B类IP地址,网络标识为“128.73”,主机标识为“a.b”。 b、根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们现在需要12个子网,将来可能需要16个。用第三个字节的前四位确定子网掩码。前四位都置为“1”,即第三个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。 c、把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0”,则子网掩码的间断二进制形式为:“11111111.11111111.11110000.00000000” d、把这个数转化为间断十进制形式为:“255.255.240.0” 这个数为该网络的子网掩码。4.IP掩码的标注 A、无子网的标注法 对无子网的IP地址,可写成主机号为0的掩码。如IP地址210.73.140.5,掩码为255.255.255.0,也可以缺省掩码,只写IP地址。 B、有子网的标注法 有子网时,一定要二者配对出现。以C类地址为例。IP地址中的前3个字节表示网络号,后一个字节既表明子网号,又说明主机号,还说明两个IP地址是否属于一个网段。如果属于同一网络区间,这两个地址间的信息交换就不通过路由器。如果不属同一网络区间,也就是子网号不同,两个地址的信息交换就要通过路由器进行。例如:假设maskwe为27,对于IP地址为210.73.140.5的主机来说,其主机标识为00000101,对于IP地址为210.73.140.16的主机来说它的主机标识为00010000,以上两个主机标识的前面三位全是000,说明这两个IP地址在同一个网络区域中,这两台主机在交换信息时不需要通过路由器进行;210.73.60.1的主机标识为00000001,210.73.60.252的主机标识为11111100,这两个主机标识的前面三位000与011不同,说明二者在不同的网络区域,要交换信息需要通过路由器。其子网上主机号各为1和252。Part 2 具体实现通过以上的原理,我们就知道了在检验IP地址和子网检验时应该明确的问题,关键的两点就是把输入的IP分解成各段,然后判断子网号,掩码和ip地址的基本格式是否合法,其次:如果三者的基本格式都合法,才调用断定,ip地址是否为子网成员,的函数。该函数同时判别子网号与掩码是否匹配,子网号为全0或全1,主机号为全0、全1。1. 实现流程制定规则分别判断子网号,掩码,ip是否合法设计数据结构算法实现调试 测试数据分析2. 编程本部分的编程的主要目的是算法的实现,主要的方法是C+中字符串处理。(1)类设计a.属性char ip15; /用于存放ip地址char ip_Temp15; /用于存放ip地址char subnet_mask18; /用于存放subnet_mask地址char subnet18; /用于存放subnet地址char subnet_Temp18; /用于存放subnet地址int mask; /用于存放mask(1的个数)bool maskIsValid; /用于判断的个数是否合适,或是否与subnet匹配b.方法构造函数,析构函数:ipTest(char *,char *); /自定义初始化类函数ipTest(); /析构函数 主判断函数 (即主要的方法):void AllJudgment(); /判断mask,subnet,ip的合法性问题bool ipIsValid(char *); /判断ip是否合法Bool subnetIsValid(char *); /判断子网号subnet是否合法bool NoIllegalChar(char *); /ip,subnet地址中非法字符的判断bool maskIsMatSubnet(int,char *);/判断mask与subnet是否匹配工具函数: void print(); /判断ip是否为子网成员,并输出判断结果void split(char *,int *); /把单个字符地址转换为十进制数值型地址(含四段)Int toBinary(int a); /十进制int型数据转换为二进制int型数据char * toString(int *a);/把二进制int型数据转换为一个整体的二进制字符型数据 (2)主函数int main(int argc,char *argv) 函数 1.获取参数 2.简单判断参数格式(长度) 3.若是正常参数,实例化 ipTest类 4.调用主判断函数void AllJudgment() 判断 5.输出结果 (3)程序流程(4)头文件#include #include #include #include #include #include using namespace std;五. 实验分析及测试本部分测试了正常输入和非法输入时,程序对输入的判断,编程的环境为VS2008,在解决方案文件夹下面的Debug文件夹里面生成可执行文件;运行MS-DOS,进入Debug文件夹进行测试。1.算法正确性检测(1)用正确格式和合法的数据的输入,测试Mask和IP的匹配测试数据: IP:128.196.33.12 Mask:15和16分析:IP:128.196.33.12属于B类IP地址,前16位位网络段,后16位为主机段,所以Mask至少为16结果截图:(2)用正确格式和合法的数据的输入,测试主网和子网的匹配测试数据: 主网IP:128.196.33.12子网IP:128.196.127.17 和128.196.63.17 Mask:18分析:主网IP 和子网IP都是属于B类IP地址, 前8位为网络段,后8位为主机段,Mask至少为16由于Mask为18,可知道在主机段中前两位,也就是IP地址的第9,10位为子网号(18-16=2);而B 类IP地址的子网掩码为255.255.0.0所以可知:IP:128.196.33.12 1000 0000.1100 0100.0010 0001.0000 1100 2位相于,得:00Mask:255.255.0.0 1111 1111.1111 1111.0000 0000.0000 0000 2位相于,得:01IP:128.196.127.17 1000 0000.1000 0100.0111 1111.0001 0001结果为不匹配。截图:IP:128.196.33.12 1000 0000.1100 0100.0010 0001.0000 1100 2位相于,得:00Mask:255.255.0.0 1111 1111.1111 1111.0000 0000.0000 0000 2位相于,得:00IP:128.196.63.17 1000 0000.1000 0100.0011 1111.0001 0001结果为匹配。截图:(3)补充说明:i)主网和子网匹配的时候,实际上的与运算的位数是Mask个数,即Mask有多少,就相与前多少个位。而以上例子中可知,B类IP地址的子网掩码为255.255.0.0,所以前8位全是1,所以无论IP是多少,相与结果都是1,即不用考虑网络段,直接相与主机段的前n 段即可,n=(mask-所属网络分类的主机段位数)。本测试例子中位2。ii)考虑(2)中的两个3个IP地址可以发现当主网IP为128.196.33.12,mask为18时,IP和子网掩码相与,主机号前两位为00,所以可推出,子网IP的只需要主机段的前两位为00,则都可以匹配,即子网IP的第3节(第17位到第24位)为00XX XXXX ,转化为十进制就是小于63的整数就可以匹配。2.输入合法性测试本实验程序规定输入的标准参数输入格式为:X.X.X.X/MASK X.X.X.X ,其中:X为0-255的十进制整数,mask为0-32的十进制整数,两个IP地址中间用空格分开,IP地址的为4段,每一段都用 “.”分开,IP地址中允许出现空格或其他字符(1)输入的IP地址中含有非法字符测试数据: 主网IP:128.196.33.a2 子网IP:12e.196.127.17 Mask:1h结果截图:(2)输入的IP地址段数不正确测试数据: 主网IP:128.33.12 子网IP:126.196. Mask:18结果截图:(3)没有输入mask测试数据: 主网IP:128.196.33.12 子网IP:128.196.33.11 结果截图: (4)输入mask超出合法范围测试数据: 主网IP:128.196.33.12 子网IP:128.196.33.11 Mask:35结果截图:(5)输入IP超出合法范围测试数据: 主网IP:555.196.33.12 子网IP:128.999.33.11 Mask:25结果截图:(6)特殊的IP地址测试数据: 主网IP:0.0.0.0 子网IP:127.1.1.1 Mask:0结果截图: 测试数据: 主网IP:0.0.0.0 子网IP:255.255.255.255 Mask:0结果截图:六. 实验结论本实验根据现在通用的IP地址分配使用规则,设计实验算法,运用C+字符转函数处理,程序实现了基本要求的功能,考虑到了多方面的因素;另一方面,设计之初的思路把此程序定位在接口工具程序,所以省略掉UI的设计,考虑到了扩展性的方面需要,程序提供简单、方便的接口和较为简单参数,方便扩展使用。仍存在的问题:数据结构的设计不够清晰简练和方便使用,可读性不太好;主函数流程存在一定的问题,理路不是很清晰,主要是类的各个方法的设计没有总体考虑,设计之初没有考虑,在需要时才加,导致程序结构有点乱,不易阅读和检查。七. 附录 源代码说明:源文件语言:C+文件数:1源文件名:ipTest.cpp#include #include #include #include #include #include using namespace std;/ipTest类定义class ipTestchar ip15; /用于存放ip地址char ip_Temp15; /用于存放ip地址char subnet_mask18; /用于存放subnet_mask地址char subnet18; /用于存放subnet地址 char subnet_Temp18; /用于存放subnet地址int mask; /用于存放mask(1的个数)bool maskIsValid; /用于判断的个数是否合适,或是否与subnet匹配public:ipTest(char *,char *); /自定义初始化类函数ipTest(); /析构函数bool ipIsValid(char *); /判断ip是否合法bool subnetIsValid(char *); /判断子网号subnet是否合法bool NoIllegalChar(char *); /ip,subnet地址中非法字符的判断bool maskIsMatSubnet(int,char *);/判断mask与subnet是否匹配void AllJudgment(); /判断mask,subnet,ip的合法性问题 void print(); /判断ip是否为子网成员,并输出判断结果void split(char *,int *); /把单个字符地址转换为十进制数值型地址(含四段)int toBinary(int a); /十进制int型数据转换为二进制int型数据char * toString(int *a);/把二进制int型数据转换为一个整体的二进制字符型数据;/main主函数int main(int argc,char *argv) /自动读取数据/cout目录地址:argv0endl; /argv0表示ipTest.exe的保存目录地址coutsubnet_mask : argv1endl; /argv1表示第二个参数,即subnet/mask coutip地址: argv2endlendl;/argv2表示第三个参数,即ip/判断段数是否输入合法if(argc!=3) /argc表示输入的参数个数,无参数输入时,其值为,因为默认argv0总是有的cout18)cout15)coutip 输入非法!;system(pause);return 0;ipTest test(argv1,argv2); /实例化类,传入两个参数test.AllJudgment();/调用函数,判断mask,subnet,ip的合法性问题system(pause);/系统暂停return 0;/构造函数ipTest:ipTest(char *subnet_mask,char *ip)maskIsValid=true; /设置maskIsValid默认为合法char temp2;/定义变量int i,len;len=strlen(subnet_mask); /*从subnet/mask中分离出subnet地址*/for(i=0;isubneti=subnet_maski;this-subnet_Tempi=subnet_maski;subnet_Tempi=0; subneti=0; /*判断mask是否为数值*/if(len-(i+1)0) /判断mask是否为一/二位字节if(len-(i+1)=1) /表明mask是一位temp0=subnet_maski+1;/判断字符是否为数值型字符if(!isdigit(temp0) /isdigit()为库函数,可以调用coutmask中含有非数字的非法字符,error!endl;maskIsValid=false; /mask不是数值,则设置为falseelse if(len-3)=i) /表明mask是二位 temp0=subnet_maski+1; temp1=subnet_maski+2; if(!(isdigit(temp0) & isdigit(temp1) coutmask中含有非数字的非法字符,error!endl; maskIsValid=false; mask=atoi(temp); /自动把数字字符转换为对应的十进制数值的函数if(mask32)maskIsValid=false;else /表明mask为空或字节超出范围coutmask为空或超出范围,error!subnet_mask,subnet_mask); /给subnet_mask赋值strcpy(this-ip,ip); /给ip赋值strcpy(this-ip_Temp,ip); /给ip_temp赋值/判断mask,subnet,ip的合法性问题void ipTest:AllJudgment()/设置标志subnet地址是否合法的bool型变量,并调用subnetIsValid函数判断bool subnetIsV=subnetIsValid(subnet_Temp); /设置标记ip地址是否合法的bool型变量,并调用ipIsValid函数判断bool ipIsV=ipIsValid(ip_Temp); /设置标记mask与subnet地址是否匹配的bool型变量,并调用maskIsMatSubnet函数判断bool maskIsMatSub=maskIsMatSubnet(mask,subnet_Temp);coutendl; /*判断返回的值是否为真*/if(!maskIsValid) /表示返回的maskIsValid是falsecoutmask输入非法!(mask为整数并在-32范围内)endl;elsecoutmask合法!endl;if(!maskIsMatSub)/表示返回的maskIsMatSub是falsecoutmask与subnet不匹配,error!endl;elsecoutmask与subnet匹配!endl;if(!subnetIsV)/表示返回的subnetIsV是falsecoutsubnet地址非法!endl;elsecoutsubnet地址合法!endl;if(!ipIsV)/表示返回的ipIsV是falsecoutip地址非法!endl;elsecoutip地址合法!0 & nbsubnet0127 & mask8)/mask的值小于coutmask与subnet不匹配,error!=128 & nbsubnet0=191 & mask16) /mask的值小于coutmask与subnet不匹配,error!=192 & nbsubnet0=223 & mask24)/mask的值小于coutmask与subnet不匹配,error!endl;return false;/mask与subnet地址匹配return true;/把单个字符地址转换为十进制数值型地址(含四段)void ipTest:split(char *chaddr,int *addr)char ch= .;char *token,*dot4;int iplen=0;token=strtok(chaddr,ch);while(token!=NULL)dotiplen=token;addriplen=atoi(dotiplen);/atoi()函数把字符数值转换为int型数值iplen+;token=strtok(NULL,ch);/ip,subnet地址中非法字符的判断bool ipTest:NoIllegalChar(char *ch)int i,len=strlen(ch);for(i=0;i9 | chi-00)return false;return true;/判断ip是否合法bool ipTest:ipIsValid(char *ip)/*把地址分为四段,保存在dot中*/char ch= .;char ip_one18;strcpy(ip_one,ip);char *token,*dot4;int iplen=0;/库函数strtok(),以ch为界限来分段token=strtok(ip_one,ch);while(token!=NULL)dotiplen=token;iplen+;token=strtok(NULL,ch);/此时,第一个参数必须换为NULL /*判断地址中的段数*/if(iplen!=4)cout地址ip的段数不是,error!endl;return false; /*判断地址中的.是否正确*/int j,t=0;for(j=0;j=strlen(ip);j+)if(ipj=.)t+;if(t!=3)cout地址ip中的.不是,error!endl;return false; /*判断地址是否含有非法字符,每段地址数值溢出*/int i;for(i=0;i255)if(!NoIllegalChar(doti) /判断含有非法字符cout地址ip中含有非数字的非法字符,error!255) /判断数值溢出cout地址ip中含有不在-255间的数字,error!endl;return false; /*判断全或全的情况*/int flag=1;/首先设置为非法,即全for(i=0;iiplen;i+)if(atoi(doti)!=0)/含有非的字段flag=0; if(flag=1)cout地址ip全为全,error!endl;return false;flag=1;/首先设置为非法,即全for(i=0;iiplen;i+)if(atoi(doti)!=255)flag=0;if(flag=1) cout地址ip全为全,error!0&atoi(dot0)127) /A类ip地址j1=1; /直接从开始if(atoi(dot0)=127) /为的特殊号coutip地址ip网络号为!,error!=128&atoi(dot0)=192&atoi(dot0)223&atoi(dot0)255)cout请重新输入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=j2;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;strcpy(subnet_one,subnet); /把subnet地址复制给subnet_onestrcpy(ip_one,ip); /把ipt地址复制给ip_one/split()函数把字符型的地址转换为四段int型的地址split(subnet_one,nbsubnet); /用subnet_one而非subnet是为了保护subnet地址不被破坏split(ip_one,nbip);for(i=0;i4;i+) nbipi=toBinary(nbipi);/将分离出来的十进制转换为二进制nbsubneti=toBinary(nbsubneti); char *cbip=new char33; char *cbsubnet=new char33; cbip=toString(nb
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 难点解析-公务员考试《常识》重点解析试卷(含答案详解版)
- 难点解析公务员考试《常识》同步练习试题(解析版)
- 内江市市中区卫生健康局内江市市中区精神病医院招聘员额专业技术人员的模拟试卷及参考答案详解
- 南京汽车集团有限公司校园招聘85人公开引进高层次人才和急需紧缺人才笔试参考题库答案详解版学生专用
- 2025年公安局警务辅助人员招聘考试笔试试题(附答案)
- 2025年公安辅警招聘知识考试练习题(答案+解析)
- 2025年法学硕士研究生入学考试题及答案
- 新能源汽车生产基地建设成本分析与效益预测报告
- 化工新材料在航空航天导航系统中的应用现状与2025年市场分析报告
- 资质年审合同范本
- 电焊工安全用电培训
- 安宁疗护服务规范
- 《高血压的护理常规》课件
- 2025年广西广投智能科技有限公司招聘笔试参考题库含答案解析
- 《细胞信号与分子通路》课件
- 妇产科护理技能实训 课件 2.2.2产前会阴清洁与消毒
- 《更年期的中医调理》课件
- 2025年内蒙古自治区体育局招聘12人历年管理单位笔试遴选500模拟题附带答案详解
- 重庆潼南2024年面向社会招聘教育系统人员历年管理单位遴选500模拟题附带答案详解
- 《建筑设计防火规范》课件
- 皮肤美容诊所布局规划方案
评论
0/150
提交评论