《计算机网络课设---判断一个IP地址是否合法.doc》由会员分享,可在线阅读,更多相关《计算机网络课设---判断一个IP地址是否合法.doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、- -目 录1 课程设计目的12 课程设计要求13相关知识14课程设计分析341程序大致设计过程342实验流程图35程序代码56运行结果与分析117参考文献12- - word.zl- -1 课程设计目的本设计要求编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定子网。从而考察读者是否对IP地址概念及其子网划分有非常清楚的认识。2 课程设计的要求 根据介绍的IP地址与子网划分的知识,编写程序判断IP地址的合法性及所属子网。(1)以命令行形式运行IPAddress subnet_address/mask ip_address其中,IPAddress为程序名,subnet_addre
2、ss为子网地址,mask为掩码,ip_address为IP地址。(2)输入容:IP地址、子网地址与掩码是否合法,以及IP地址是否属于子网。3 相关知识1. IP地址相关概念所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。 按照TCP/IPTransport Control Protocol/Internet Protocol,传输控制协议/Internet协议协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。例如一个采用二进制形式的IP地址是“0001,这么长的地址,人们处理起来也太费力了。为了方便人们的使用,IP地址经常被
3、写成十进制的形式,中间使用符号“分开不同的字节。于是,上面的IP地址可以表示为“10001。IP地址的这种表示法叫做“点分十进制表示法,这显然比1和0容易记忆得多。 大型的互连网络中应该有一个全局的地址系统,它能够给连接到互联网的每一台主机或者路由器分配一个唯一的全局地址。TCP/IP协议的网络层使用的地址标识符叫做IP地址,IPv4中IP地址是一个32位的二进制地址。网络中的每一台主机或者路由器至少有一个IP地址,在Internet中不允许有两个设备具有一样的IP地址。如果一台主机或者路由器连接到两个或多个物理网络,那么它可以拥有两个或多个IP地址。IP地址采用分层构造,由网络号与主机号两局
4、部组成如下列图1所示:网络号主机号 图1IP地址长度为32位,用点分十进制表示,格式为.,每个为8位,每个的值为0255例如202.113.29.119。根据不同的取值围,IP地址可以分为五类,IP地址中的前5位用于标识IP地址的类别,具体的分类规那么如下:A类地址的第一位为0。B类地址的前两位为10 .C类地址的前三位为110。D类地址的前四位为1110。E类地址的前五位为11110。五类IP地址的构造如下列图2所示;0网络号7位主机号24位10网络号14位主机号16位110网络号21位主机号8位1110组播地址28位11110保存用于课程设计和将来使用 图2A类IP地址构造适合用于有大量主
5、机的大型网络。由于主机号长度为24位,因此每个A类网络的主机IP数理论上为224=16777216。B类IP地址适合用于一些国际性大公司与政府机构等中等大小的组织。由于网络IP长度为14位,因此允许有214=16384个不同的B类网络,实际允许连接16382个网络。C类IP地址适合用于一些小公司与普通的研究机构。2子网的划分划分子网实际上就是在IP地址系统中增加一个层次。三级IP地址的表示方法为netID-subnet ID-host ID。第一级网络号定义了网点的位置;第二级子网号定义了物理子网;第三级主机号定义了主机和路由器到物理网络的连接。三级层次的IP地址,一个IP分组的路由器的过程分
6、为三步:第一步将分组转发给网点,第二步转发给物理子网,第三步转发给确切的主机。当三级层次的IP地址提出后,一个很显示的问题是:如何从一个IP地址提取出子网号。因此,提出了子网掩码subnet mask的概念。子网掩码有时也叫做子网掩码。子网掩码表示方法:网络号与子网号置1,主机号置0。4课程设计分析41程序大致设计过程:1.分别判断子网号、掩码和IP地址的根本格式是否合法。2.如果三者的根本格式都合法,才调用判定“IP地址是否为子网成员的函数。该函数同时判别子网号与掩码是否匹配,子网号为全0或全1,主机号为全0、全1.42实验流程图如下:1.主流程图YNYYYNNN开场子网是否合法Ip地址是否
7、属于子网完毕掩码是否合法ip地址是否合法图3主流程图2.验证ip地址合法性流程图YN开场完毕用正那么表达式判断是否合法输入ip地址图4验证ip地址合法性流程图3验证子网掩码合法性流程图YN开场完毕用正那么表达式判断是否合法输入子网掩码图5 验证子网掩码合法性流程图5 程序代码#include#include#include#include /定义 ip地址类class ipTest char ip15; char subnetPlusMask18; char subnet10; char TempIp15; char TempSub10; int mask; bool maskIsValid;
8、public: ipTest(char*,char*); ipTest(); bool NoIllegalChar(char*); bool ipIsValid(char*); bool subnetIsValid(char*); void belong(); void print(); ;void main(int argc,char* argv)/检查输入命令格式if(argc!=3)cout18) cout15) coutIp Address is too long!; return; /实例化ipTest类 ipTest test(argv1,argv2); test.print();
9、 /IP地址类构造函数 ipTest:ipTest(char* subnetPlusMask,char*ip) maskIsValid=true; char temp2; /将1前的字符复制到subnet中 int smLen=strlen(subnetPlusMask); for(int i=0;isubneti=subnetPlusMaski; this-TempSubi=subnetPlusMaski; subneti=0; TempSubi=0;/初始化if(i=smLen-2)temp0=subnetPlusMaski+1;if(!isdigit(temp0)maskIsValid=
10、false;elseif(i=smLen-3)temp0=subnetPlusMaski+1;temp1=subnetPlusMaski+2;if(!(isdigit(temp0)&isdigit(temp1)maskIsValid=false;mask=atoi(temp);if(mask32)maskIsValid=false;else maskIsValid=false;/为subnetPlusMask与ip赋值strcpy(this-subnetPlusMask,subnetPlusMask);strcpy(this-ip,ip);strcpy(this-TempIp,ip);/调用判
11、别函数并输出结果void ipTest:print()bool subIsV=subnetIsValid(TempSub);bool ipIsV=ipIsValid(TempIp);/判断子网是否合法if(!subIsV)coutSubnet is invalidendl;elsecoutValid subnet:subnetendl;/判断掩码是否合法if(!maskIsValid)coutMask is invalidendl;elsecoutValid mask:maskendl; /判断是否IP地址合法if(ipIsV)coutIP adress is invalidendl;else
12、coutValid ip address:endl;/判断IP地址是否属于子网if(subIsV&ipIsV&maskIsValid)belong();/判断是否含有非数字字符bool ipTest:NoIllegalChar(char* ch)unsigned int i;unsigned int k=0;/判断每位是否为数字字符for(i=0;istrlen(ch);i+)if(isdigit(*(ch+i)=0)return false;return true;/判断IP地址是否合法bool ipTest:ipIsValid(char* ip)char ch=.;char *token,
13、*dot4;int iplen=0;/以.标志将字符串按节分开/以.标志将IP字符串按节分开token=strtok(ip,ch);while(token!=NULL)dotiplen=token;iplen+;token=strtok(NULL,ch);/判断IP地址的段数if(iplen!=4) return false;/有非法字符或某段值非法for(int i=0;i255) return false; return false; /判断子网是否合法 bool ipTest:subnetIsValid(char*subnet) /调用判别地址合法性函数 if(!ipIsValid(su
14、bnet) return false; return true;/判断IP地址是否为子网成员void ipTest:belong() int subLen=strlen(subnet);int ipLen=strlen(ip);unsigned int iIPA,iSubA,iMask;unsigned char subA4,ipA4;char temp3;int i,j,t=0;for(i=0,j=0;isubLen;i+) /temp数组中放.间的串if(subneti!=.)tempj+=subneti;else subA3-t=atoi(temp); j=0; t+; temp0=te
15、mp1=temp2=0; subA0=atoi(temp); temp0=temp1=temp2=0; iSubA=*(unsigned int*)subA; for(i=0,j=0;iipLen;i+) if(ipi!=.) tempj+=ipi; else ipA3-t=atoi(temp); j=0; t+; temp0=temp1=temp2=0; ipA0=atoi(temp);iIPA=*(unsigned int*)ipA;/获得掩码子网号与掩码不匹配iMask=0xffffffff; iMask=(32-mask);/子网号与掩码不匹配if(iSubA|iMask)!=iMas
16、k)coutSubnet and mask not match!;return;/子网号为全1if(iSubAiMask)=0) coutSubnet is all 1!;return;/子网号为全0if(iSubA&iMask)=0) coutSubnet is all 0!;return;/IP地址与子网号比拟if(iSubA)=(iIPA&iMask)/IP地址全为1if(iSubA|iMask)=0xffffffff) coutIp address is all 1!;return; /IP地址全为0if(iSubA|iMask)=iMask) coutIp address is al
17、l 0!;return; /IP地址属于子网coutip belong to subnetPlusMaskendl;return;else coutip not belong to subnetPlusMaskendl;6. 运行结果与分析分析:此题需要在另外下载一个IP地址捕捉器,在有网的情况下才能获得IP地址,程序才能进展。程序流程分析:先分别判断子网号、掩码和IP地址的根本格式是否合法。如果三者的根本格式都合法,才调用判定“IP地址是否为子网成员的函数。该函数同时判别子网号与掩码是否匹配,子网号为全0或全1,主机号为全0、全1。7.参考文献1希仁 编著. 计算机网络 第5版 .:电子工业,20082吴宜功 吴英 编著. 计算机网络课程设计 第2版. : 机械工业,2012- - word.zl-