IP地址的合法性及子网判断.docx
- 文档编号:6953384
- 上传时间:2023-01-13
- 格式:DOCX
- 页数:17
- 大小:90.63KB
IP地址的合法性及子网判断.docx
《IP地址的合法性及子网判断.docx》由会员分享,可在线阅读,更多相关《IP地址的合法性及子网判断.docx(17页珍藏版)》请在冰豆网上搜索。
IP地址的合法性及子网判断
计算机网络课程设计报告
题目:
IP地址的合法性及子网判断
学生姓名:
学号:
专业班级:
同组姓名:
指导教师:
设计时间:
指导老师意见:
评定成绩:
签名:
日期:
年月日
一、课程设计目的和意义
1.1设计目的
通过计算机网络课程设计,让我们学会处理几种常用计算机网络问题的基本处理方法,掌握计算机网络的基本原理,使我们在面对不断变化的技术时,具有跟踪,学习的基础与能力。
掌握IP地址的分类,准确理解子网、掩码的概念,确切地明了IP地址的合法格式。
并判断该地址是否属于一个给定的子网。
具体而言,关于”IP地址的合法性及子网判断”课程设计题目的目的是:
用C/C++语言编写程序,以判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网.从而能够考察我们对IP地址的概念,各类IP地址的区分以及子网划分的理解和掌握程度.
1.2设计的意义
1、有利于基础知识的理解
通过计算机网络的学习,学生掌握了一些信息时代生存与发展必需的信息技术基础知识和基本技能,具备了在日常生活与学习中应用信息技术解决问题的基本态度与基本能力。
让学生接触了程度设计,就能真正理解,从而进一步打破计算机的神秘感。
2、有利于逻辑思维的锻炼
程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。
即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养。
3、有利于与其他学科的整合
在程序设计中,我们可以解决其它学科有关问题,也利用其它课程的有关知识来解决信息技术中比较抽象很难理解的知识。
在信息技术课中整合其它学科的知识,发挥信息技术的优势。
4、有利于治学态度的培养。
程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。
因此,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。
有助于严谨治学、一丝不苟的科学精神的培养,以及不怕失败、百折不挠品格的锻炼。
二、课程设计的内容和要求
在掌握IP地址的表示方法以及子网划分方法的基础上,并以计算机网络中关于IP地址的相关理论知识为基石,运用C/C++语言按如下要求完成程序。
(1)命令行格式:
ip_testsubnet/maskip_addr
其中,ip_test为程序名;subnet为子网号;mask是一个整型数值,代表子网掩码连续1的个数;ip_addr表示要测试的IP地址。
比如说,要测试的IP地址为202.113.16.10,子网号码是202.113.16.0,子网掩码是255.255.255.0,则命令行为ip_test202.113.16.0/24202.113.16.10。
(因为255.255.255.0是连续的24个1,所以用24表示)
(2)判断subnet和ip_addr的合法性。
在判断IP地址合法性时要自行编写代码,不要使用任何inet 函数。
判断时要考虑各种情况,全面分析问题。
例如以下IP地址均不合法:
123..2.1
123.23$.2.1
123.2345.2.1
123.23.45.1
(3)判断掩码的合法性。
譬如说mask的值为负数或者大与32,这时输入的掩码就不合法。
(3)在IP地址合法,掩码合法以及子网号也合法的前提下,判断ip_addr是否属于subnet。
(4)输出命令行中的ip是否合法,掩码是否合法,子网号码是否合法(可适当给出不合法的原因)以及ip_addr是否属于子网subnet。
(5)还可以判断子网号,主机号全0,全1问题。
三、课程设计的相关技术
3.1课程设计的运行环境
C++是一种使用非常广泛的计算机编程语言。
C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。
它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格.
本程序在Windows环境下利用C++语言编写,MicrosoftVisualStudio6.0进行编译。
VisualStudio是微软公司推出的开发环境,VisualStudio可以用来创建Windows平台下的Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和office插件。
3.2IP地址相关概念和知识的回顾。
大型的互连网络中应该有一个全局的地址系统,它能够给连接到互联网的每一台主机或者路由器分配一个唯一的全局地址。
TCP/IP协议的网络层使用的地址标识符叫做IP地址,IPv4中IP地址是一个32位的二进制地址。
网络中的每一台主机或者路由器至少有一个IP地址,在Internet中不允许有两个设备具有相同的IP地址。
如果一台主机或者路由器连接到两个或多个物理网络,那么它可以拥有两个或多个IP地址。
IP地址采用分层结构,由网络号与主机号两部分组成(如下图所示):
网络号
主机号
IP地址长度为32位,用点分十进制表示,格式为ⅹ.ⅹ.ⅹ.ⅹ,每个ⅹ为8位,每个ⅹ的值为0—255(例如202.113.29.119)。
根据不同的取值范围,IP地址可以分为五类,IP地址中的前5位用于标识IP地址的类别,具体的分类规则如下:
·A类地址的第一位为0。
·B类地址的前两位为10.
·C类地址的前三位为110。
·D类地址的前四位为1110。
·E类地址的前五位为11110。
五类IP地址的结构如下所示;
0
网络号(7位)
主机号(24位)
10
网络号(14位)
主机号(16位)
110
网络号(21位)
主机号(8位)
1110
组播地址(28位)
11110
保留用于课程设计和将来使用
A类IP地址结构适合用于有大量主机的大型网络。
由于主机号长度为24位,因此每个A类网络的主机IP数理论上为224=16777216。
B类IP地址适合用于一些国际性大公司与政府机构等中等大小的组织。
由于网络IP长度为14位,因此允许有214=16384个不同的B类网络,实际允许连接16382个网络。
C类IP地址适合用于一些小公司与普通的研究机构。
3.3特殊的IP地址形式
(1)直接广播地址
A类,B类,C类IP地址中主机号全1的地址称为直接广播地址,用来使路由器将一个分组以广播方式发送给特定网络上的所有主机。
直接广播地址只能作为分组中的目的地址。
物理网络采用的是点—点传输方式,分组广播需要通过软件来实现。
网络号
主机号全1
(2)受限广播地址
网络号与主机号的32位全位1的地址为受限广播地址,用来将一个分组以广播方式发送给本网的所有主机。
本网的所有主机将接受该分组,路由器则阻挡该分组通过。
全1
(3)“这个网络上的这台主机”地址
全0
(4)“这个网络上的特定主机”地址
主机或路由器向本网络上的某个特定的主机发送分组,网络号部分为全0,主机号为确定的值。
这样的分组被相知在本网络内部。
网络号全0
主机号
(5)回送地址
回送地址用于网络软件测试和本地进程见通信。
TCP/IP协议规定网络号为 127的分组不能出现在任何网络上;主机和路由器不能为该地址广播任何寻址信息。
127
任意值(通常取1)
3.4子网的划分
人们在早期设计与建设ARPAnet是,没有预料到网络的发展速度如此之快,应用范围如此之广。
当时个人计算机与局域网尚未出现。
所以,研究者在设计Internet地址的编址方案时,主要是针对大型互联的网络结构。
设计IP地址的最初目的是希望每个IP得志都能唯一地、确定地识别一个网络与一台主机,但是这种方法同时也存在着两个主要的问题,即IP地址的有效利用率和路由器的工作效率。
为了解决这个问题,人们提出了子网(subnet)和超网(supernet)的概念。
子网就是一个大的网络划分成几个较小的网络,而每一个小网络都是其自己的地址。
超网就是将一个组织所属的几个C类网络合并成为一个更大地址范围的逻辑网络。
划分子网实际上就是在IP地址系统中增加一个层次。
三级IP地址的表示方法为netID-subnetID-hostID。
第一级网络号定义了网点的位置;第二级子网号定义了物理子网;第三级主机号定义了主机和路由器到物理网络的连接。
三级层次的IP地址,一个IP分组的路由器的过程分为三步:
第一步将分组转发给网点,第二步转发给物理子网,第三步转发给确切的主机。
当三级层次的IP地址提出后,一个很显示的问题是:
如何从一个IP地址提取出子网号。
因此,提出了子网掩码(subnetmask)的概念。
子网掩码有时也叫做子网掩码。
子网掩码表示方法:
网络号与子网号置1,主机号置0。
如判断某一IP地址是否属于某一子网呢?
只需将二进制IP地址与子网掩码按位进行“与”运算。
若“与”运算所得值与给定子网地址一致,则说明该IP地址属于给定的子网。
四、课程设计过程
4.1程序大致设计过程:
1.分别判断子网号、掩码和IP地址的基本格式是否合法。
2.如果三者的基本格式都合法,才调用判定“IP地址是否为子网成员”的函数。
该函数同时判别子网号与掩码是否匹配,子网号为全0或全1,主机号为全0、全1.
4.2实验流程图如下:
1.主流程图
图3-1 主流程图
2.验证ip地址合法性流程图
图3-2 验证ip地址合法性流程图
3验证子网掩码合法性流程图
图3-3 验证子网掩码合法性流程图
4.验证ip是否属于某个子网流程图:
图3-4 验证ip是否属于某个子网流程图
五、部分程序运行结果
程序主要运行界面:
1)测试格式是否为三段格式如图:
分析:
程序要求是“程序名子网号/掩码ip地址”格式而这里只有两端造成参数不匹配,出错!
分析:
虽然格式是三段、子网号无效且掩码是零,其IP地址还是合法的!
2)简单判断子网号及掩码长度是否超出范围如图:
分析:
因为程序里设置的子网号和掩码字符串长度最多是18个字符而这里有20个字符大于18,所以出错!
分析:
程序中的IP地址字符串最长只有15个而程序中有17个字符大于15个,所以出错!
3)测试Ip地址是否合法如图:
分析:
IP地址不符合格式要求!
分析:
IP地址段数不是四,所以出错!
4)测试子网号与掩码是否匹配如图:
分析:
子网号转换为二进制:
00000001110000000000000000000000
子网掩码转换成二进制:
11111111100000000000000000000000
从以上可以看出子网号与子网掩码不匹配与输出结果是一样的说明程序算法是正确的!
分析:
子网号转换为二进制:
00000001100000000000000000000000
子网掩码转换成二进制:
11111111100000000000000000000000
从以上可以看出子网号与子网掩码匹配与输出结果是一样的说明程序算法是正确的!
5)测试子网号是否全零或全一如图:
六、课程设计小结
这次课程设计,感触颇深!
课程设计是学生考试前最后一个重要学习环节,是学习深化与升华的重要过程。
经过这次课程设计,我发现现在学习的知识远远不够,经过自学以及向同学们学习才得以完成这次课程设计。
此次课程设计任务是写一个判断ip地址的合法性和判断这个ip地址是否为某一个子网。
花了一天多时间才完成了程序的编写,总体上说收获很大,程序虽然是已经学过的,不过是应用一下而已,但是还是遇到了一些问题。
收获最大的地方是关于计算机网络的知识,这次课程设计,让我明白了ip地址和子网掩码的关系,同时也明白了子网的划分。
在这一周的时间里,我通过这次的课程设计加强了自己掌握和理解计算机网络理论原理的能力,培养了自己的实际动手能力与综合设计能力,并提高了自己的技术素质。
课程设计一向是我比较喜欢的实践项目,因为从中会学到许多东西,既检验了我们前段时间理论知识的学习效果,又锻炼了我的动手实践能力。
课程设计为我们提供了一个既动手又动脑,独立参加实践的好机会,要求我们将理论知识和实际情况有机地结合起来,锻炼我们的分析问题,解决实际问题的能力,提高我们适应实际,实践的能力;它也要求我们综合运用所学的计算机网络知识来解决有一定难度的问题,从而提高了我们对知识的综合运用能力,加深对知识间的融会贯通和联系的理解。
实验报告有点难搞,好多东西都要一点一点的敲上去,很是辛苦。
不过搞好了也是件值得开心的事。
对我而言,知识上的收获很重要,精神上的丰收更加可喜。
挫折是一份财富,经历是一份拥有。
这次实习必将成为我人生旅途上一个非常美好的回忆!
希望以后还会有这样的机会锻炼自己。
也希望老师们能多为学生们提供类似的机会,只有这样的锻炼机会多了,才能不断提高我们的动手实践能力.
七、参考文献
⑴张尧学;计算机网络与Internet教程;北京:
清华大学出版社
⑵吴功宣;计算机网络课程设计;北京:
机械工业出版社
附录一:
源代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragmacomment(lib,"ws2_32.lib")
//类结构
classipTest{
public:
charip[15];
charsubnetPlusMask[18];
charsubnet[18];
charTempIp[15];
lmaskIsValid;
intmask;
charTempsub[18];
ipTest(char*,char*);
~ipTest(){};
boolNoIllegalChar(char*);//非法字符的判断
boolipIsValid(char*);//判断IP地址是否合法
boolsubnetIsValid(char*);//判断子网号是否合法
voidbelong();//判断IP是否为子网成员
print();
}
;
//主函数
voidmain(intargc,char*argv[]){
if(argc!
=3){//判断参数格式化是否正确
cout<<"error"< ip_testsubnet/maskip"< return; } else{ if(strlen(argv[1])>18){//先判断最简单的错误,长度是否超出 cout<<"subnet/maskistoolong"; return; } if(strlen(argv[2])>15){ cout<<"ipistoolong"; return;} ipTesttest(argv[1],argv[2]);//实例话ipTest类 test.print();//完成相应判别并输出结果 } } //构造函数 ipTest: : ipTest(char*subnetPlusMask,char*ip){ maskIsValid=true; chartemp[2]; //把'/'前的字符复制到subnet字符数组中 intsmLen=strlen(subnetPlusMask); for(inti=0;i ='/';i++){ this->subnet[i]=subnetPlusMask[i]; this->Tempsub[i]=subnetPlusMask[i]; } subnet[i]='\0'; Tempsub[i]='\0'; if(i<=smLen-2){//初始化mask和maskIsVslid if(i==smLen-2){ temp[0]=subnetPlusMask[i+1]; if(! isdigit(temp[0])) maskIsValid=false; } elseif(i==smLen-3){ temp[0]=subnetPlusMask[i+1]; temp[1]=subnetPlusMask[i+2]; if(! (isdigit(temp[0])&&isdigit(temp[1]))) maskIsValid=false; } mask=atoi(temp); if(mask<0||mask>32) maskIsValid=false; } else maskIsValid=false; strcpy(this->subnetPlusMask,subnetPlusMask); strcpy(this->ip,ip); strcpy(this->TempIp,ip); } //调用判别函数,并输出结果 ipTest: : print(){ boolsubIsV=subnetIsValid(Tempsub); boolipIsV=ipIsValid(TempIp); if(! subIsV) cout<<"subnetisinvalid! "< else cout<<"validsubnet: "< if(! maskIsValid) cout<<"maskisinvalid! "< else cout<<"validmask: "< if(! ipIsV) cout<<"ipisinvalid! "< else cout<<"validip: "< //判断IP是否belongsubnet if(subIsV&&ipIsV&&maskIsValid) belong(); } //子函数,判断输入是否含有非数字字符 boolipTest: : NoIllegalChar(char*ch){ unsignedinti,k=0; for(i=0;i if(isdigit(*(ch+i))==0){ returnfalse; } } returntrue; } //判别IP地址是否合法 boolipTest: : ipIsValid(char*ip){ charch[]="."; char*token,*dot[4]; intiplen=0; token=strtok(ip,ch);//以"."标志将IP字符串按节分开 while(token! =NULL){//循环进行,知道结束 dot[iplen]=token;//将分开的每段赋值给dot iplen++; token=strtok(NULL,ch); } if(iplen! =4) {cout< returnfalse;}//段数不对 for(inti=0;i<4;i++){ if(! NoIllegalChar(dot[i])||atoi(dot[i])>255)//有非法字符或某段值非法 returnfalse; } returntrue; } //判断子网号是否合法 boolipTest: : subnetIsValid(char*subnet){ if(! ipIsValid(subnet))//调用判别IP地址合法性的函数 returnfalse; returntrue; } //判断IP是否为子网成员,判断子网号与掩码是否匹配,以及子网号、主机号全0全1问题 voidipTest: : belong(){ intsubLen=strlen(subnet); intipLen=strlen(ip); unsignedintiIPA,iSubA,iMask; unsignedcharsubA[4],ipA[4]; chartemp[3]; inti,j,t=0; for(i=0,j=0;i if(subnet[i]! ='.') temp[j++]=subnet[i];//temp数组中放'.'间的串 else{ subA[3-t]=atoi(temp);//subA数组中放'.'间的数据 j=0; t++; temp[0]=temp[1]=temp[2]='\0'; } } subA[0]=atoi(temp); temp[0]=temp[1]=temp[2]='\0'; iSubA=*(unsignedint*)subA;//iSubA中放subnet中'.'除外的串对应的数 for(i=0,j=0,t=0;i if(ip[i]! ='.') temp[j++]=ip[i]; else{ ipA[3-t]=atoi(temp); j=0; t++; temp[0]=temp[1]=temp[2]='\0'; } } ipA[0]=atoi(temp); iIPA=*(unsignedint*)ipA;//iIPA中放IP中'.'除外的串对应的数 iMask=0xffffffff; iMask<<=(32-mask);//获取掩码 if((iSubA|iMask)! =iMask){//说明sub与mask不匹配 cout<<"子网号与掩码不匹配,error! "< return; } if((iSubA^iMask)==0){//说明子网号全1 cout<<"子网号全1,error! "< return;} if((iSubA&iMask)==0){//说明子网号全0 cout<<"子网号全0,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IP 地址 合法性 子网 判断