




免费预览已结束,剩余11页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
IP地址合法性及子网判断1实验目的1加深对IP地址及subnet的认识;2了解IP地址的划分;3. 了解subnet的作用和产生因素,subnet的划分;4. 实际操作编写规则,匹配IP和subnet,加深理解2实验环境2.1软件操作系统:Windows XP(Windows NT以上版本皆可)编程环境:Microsoft Visual C+ 6.0编程语言:C+测试环境: MS-DOS2.2硬件现阶段常见PC3实验原理该课程设计涉及的基本原理分两部分,一是地址合法的判断,二是是否属于一个给定子网的判断。3.1 IP地址合法性判断第一种情况、地址格式输入不合法时,要过滤掉全部情况,例如输入的为一串字符等;第二种情况、就是IP地址格式输入合法时,要过滤掉一些特殊的地址,如全为0对应当前主机,而全为1时则是当前子网的有限广播地址,所以首先要过滤这两个地址;第三种情况、的值被分割成的四个值,对这四个值有统一的要求,就是0255的整数,同时要考虑IP地址的第一个字节不能为0的情况,这个可以用正则表达式来进行匹配。除此之外,还要判断输入的子网掩码是否合法,计算出来的网络地址,主机地址是否合法。3.1.1网络寻址规则 1 网络地址必须唯一。 2 网络标识不能以数字127开头。在A类地址中,数字127保留给内部回送函数。 3 网络标识的第一个字节不能为255。数字255作为广播地址。 4 网络标识的第一个字节不能为“0”,“0”表示该地址是本地主机,不能传送。 3.1.2主机寻址规则 a. 主机标识在同一网络内必须是唯一的。 b. 主机标识的各个位不能都为“1”,如果所有位都为“1”,则该机地址是广播地址,而非主机的地址。 c. 主机标识的各个位不能都为“0”,如果各个位都为“0”,则表示“只有这个网络”,而这个网络上没有任何主机。3.2子网判断子网判断的前提是要输入子网地址,在设计的过程中采用VLSM(变长子网掩码)进行匹配,当给定子网的长度小于或等于该主机所在的网络地址长度时,说明在地址在给定的子网中,否则不在给定的自网中。3.2.1确定子网掩码数 用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。 定义子网掩码的步骤为: 1) 确定哪些组地址归我们使用。比如我们申请到的网络号为128.73.a.b,该网络地址为B类IP地址,网络标识为“128.73”,主机标识为“a.b”。 2) 根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们现在需要12个子网,将来可能需要16个。用第三个字节的前四位确定子网掩码。前四位都置为“1”,即第三个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。 3) 把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0”,则子网掩码的间断二进制形式为:“11111111.11111111.11110000.00000000” 4) 把这个数转化为间断十进制形式为:“255.255.240.0” 这个数为该网络的子网掩码。3.2.2 IP掩码的标注 对无子网的IP地址,可写成主机号为0的掩码。如IP地址210.73.140.5,掩码为255.255.255.0,也可以缺省掩码,只写IP地址。 有子网时,一定要二者配对出现。以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。4流程图在输入了IP地址以及子网号后,需要用到子网掩码来判断IP地址是否属于该子网,同时还需要判断所输入的IP地址和子网号均合法。涉及到的算法和判断比较多,所以分出多个函数来完成功能。4.1主函数流程图4.2 IP地址,子网合法性判断流程图5具体设计5.1部分函数介绍Void IPlow(char c50)函数是完成IP地址合法性判断的。首先判断输入IP地址的长度,根据规定其字符数不能超过15;其次由于IP地址中只能出现数字,除去分隔符,如果键入的IP地址不是数字,则判定为非法字符;之后判定分隔符只能有3个;在这里并不涉及到IP地址溢出的现象。在void IPdivide(char c15)中对IP地址转化成八进制,并对其是否溢出判断。在输入的时候只输入了子网掩码连续1的个数,所以要将二进制数转化成符合规定的子网掩码,void SUByan()就是这个功能。6运行结果6.1合法输入并匹配6.2合法输入不匹配6.3非法字符输入6.4数值溢出6.5分隔符出错7源代码#include#include#include#includeusing namespace std;int a4=0,0,0,0; /分段存放子网char Ip_addr15; /ip地址char sub_net15; /子网int ip4=0,0,0,0;int subnet4=0,0,0,0; /分段存放ip地址int address4=0,0,0,0;int num; /子网掩码/判断IP是否合法void IPlow(char c15) /判断IP地址不能超过15 if(strlen(c)15) coutendlIP地址总长度不能超过15!endl; return; int dotnum=0; /判断IP地址中是否存在非法字符 for(int i=0;istrlen(c);i+) if(isdigit(ci)=0 & ci!=.) coutendlIP地址中含有非法字符!endl; return ; if(ci=.) dotnum+; /判断IP地址中只能存在3个分隔符 if(dotnum!=3) coutendlIP地址中分隔符只能为3个!endl; return; /判断IP地址中是否存在连续分隔符 for(i=0;istrlen(c)-1;i+) if(ci=. & ci+1=.) coutendlIP地址中出现连续的分隔符!endl; return; /分割IP地址void IPdivide(char c15) /判断IP地址中最后不能为分隔符 for(int m=0;m4;m+) ipm=0; int len; len=strlen(c); if(clen-1=.) coutendlIP地址最后们不能为分隔符!endl; return; char temp415; for(int i=0;i4;i+) for(int j=0;j15;j+) tempij=0; int j=0; i=0; for(int k=0;kstrlen(c);k+) if(ck!=.) tempij=ck; j+; else i+; j=0; for(i=0;i3) coutendlIP地址每位长度不能超过3!endl; return; switch(len) case 3: while(len!=0) ipi+=(tempilen-1-48)*pow(10,3-len); len-; break; case 2: while(len!=0) ipi+=(tempilen-1-48)*pow(10,2-len); len-; break; default: while(len!=0) ipi+=(tempilen-1-48)*pow(10,1-len); len-; long int num=0; for(i=0;i255) coutendlIP地址数字不能超过255!endl; return; /分割网络地址void INTdivide(char c15) /判断网络地址中最后不能为分隔符 for(int m=0;m4;m+) subnetm=0; int len; len=strlen(c); if(clen-1=.) coutendl子网号最后们不能为分隔符!endl; return; char temp415; for(int i=0;i4;i+) for(int j=0;j15;j+) tempij=0; int j=0; i=0; for(int k=0;kstrlen(c);k+) if(ck!=.) tempij=ck; j+; else i+; j=0; for(i=0;i3) coutendl子网号每位长度不能超过3!endl; return; switch(len) case 3: while(len!=0) subneti+=(tempilen-1-48)*pow(10,3-len); len-; break; case 2: while(len!=0) subneti+=(tempilen-1-48)*pow(10,2-len); len-; break; default: while(len!=0) subneti+=(tempilen-1-48)*pow(10,1-len); len-; long int num=0; for(i=0;i255) coutendl子网号数字长度不能超过255!endl; return; /生成子网掩码void SUByan() cout子网掩码为:; int r32; for(int i=0;inum;i+) ri=1; for(int j=0;j32-num;j+) ri+=0; int p=0; int w8; int k=0; for(int m=0;m4;m+) int sum=0; for (int n=0;n8;n+) wp=rk; sum=sum+wp*pow(2,7-n); p+; k+; p=0; am=sum; for(int n=0;n4;n+) coutan; if(n!=3) cout.; coutendl;/判断是否和子网相等void Equal() int FLA=0; for(int i=0;i4;i+) if(ai&ipi)=subneti) FLA+; /如果存在4个1 cout结果:; if(FLA=4) cout属于同一子网!endl; else cout不属于同一子网!endl; void main() cout *IP地址的合法性及子网的判断*endl; char jj=y; while(jj!=n) coutIp_addr; coutnum; coutsub_net; coutIP地址为:; for(int i=0;i15;i+) coutIp_addri; coutendl; cout子网号为:; for(int j=0;j15;j+) coutsub_netj; coutendl; IPlow(Ip_addr); IPdivide(Ip_addr); SUByan(); INTdivide(sub_net); Equal(); coutjj; 8总结在这次的课程设计中,主要运用了计算机网络中对于IP地址的定义,以及划分子网的规则。主要是通过将输入的十进制数转化成二进制数,然后进行匹配判断,来达到子网的归属判断。IP地址的合法性判断是通过将现有的IP地址的规范转化成计算机可以识别的语言,对非法字符,分隔符的出错,以及数字键入的问题进行合法性判断。通过这次课程设计,对IP协议以及划分子网的印象更加深刻了,并熟悉了将实际问题转化成计算机能编辑的模型的能力,同时也加强了自己的编程能力。但在这次的课程设计中,也有不足之处,这个程序在输入不完整的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论