课 程 设 计
课程名称 《计算机网络》
IP地址的合法性及子网判断
计算机科学与技术学院
软件工程
软件0904
朱 鹏
周彩兰 论文题目 学 院
专 业 班
级 姓 名 指导教师
2011——2012学年 第2学期
课程设计任务书
学生姓名: 朱鹏 专业班级: 软件0904 指导教师: 周彩兰 工作单位: 计算机学院
题目四: IP地址的合法性及子网判断 初始条件:
(1)学习相关知识
(2)C/C++/VC/VB/JAVA语言
(3)PC机一台
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
在掌握IP地址表示方法及子网划分的基础上,按如下要求完成程序。
1)命令行格式:ip_test subnet/mask ip_addr, ip_test其中为程序名;subnet为子网号;mask是一个数值,代表子网掩码连续1的个数;ip_addr是要测试的IP地址。 例如,要测试的IP地址为202.114.16.10,子网号为202.113.16.0,子网掩码为255.255.255.0,则命令行为ip_test 202.113.16.0/24 202.114.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.2.1
3)判断掩码的合法性。
4)在IP地址合法的前提下,判断ip_addr是否属于子网subnet。
5)输出命令行中的ip是否合法,掩码是否合法(可适当给出不合法的原因)以及ip_addr是否属于子网subnet。
时间安排:
第一、二天:查阅资料,学习算法
第三、四天:编程调试
第五天:书写报告
指导教师签名: 年 月 日
系主任(或责任教师)签名: 年 月 日
目录
1 课程设计的目的和意义 ......................................................................................................... 4 2 课程设计的内容和要求 ......................................................................................................... 4 3 课程设计的相关技术 ............................................................................................................. 5
3.1 IP地址相关概念和知识的回顾 ............................................................................. 5
3.2 特殊的IP地址形式 .................................................................................................... 6
3.3 子网的划分 ................................................................................................................... 7 4 课程设计过程........................................................................................................................... 7
4.1 课程设计流程图 .......................................................................................................... 7
4.2 课程设计源代码 .......................................................................................................... 9
4.3 运行结果 ..................................................................................................................... 15 5 课程设计小结......................................................................................................................... 16 6 参考文献 .................................................................................................................................. 17
1 课程设计的目的和意义
通过计算机网络课程设计,让我们学会处理几种常用计算机网络问题的基本处理方法,掌握计算机网络的基本原理,使我们在面对不断变化的技术时,具有跟踪,学习的基础与能力。
具体而言,关于“IP地址的合法性及子网判断”课程设计题目的目的是:用C/C++语言编写程序,以判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网.从而能够考察我们对IP地址的概念,各类IP地址的区分以及子网划分的理解和掌握程度.
课程设计为我们提供了一个既动手又动脑,独立参加实践的好机会,要求我们将理论知识和实际情况有机地结合起来,锻炼我们的分析问题,解决实际问题的能力,提高我们适应实际,实践的能力;它也要求我们综合运用所学的计算机网络知识来解决有一定难度的问题,从而提高了我们对知识的综合运用能力,加深对知识间的融会贯通和联系的理解。
2 课程设计的内容和要求
在掌握IP地址的表示方法以及子网划分方法的基础上,并以计算机网络中关于IP地址的相关理论知识为基石,运用C/C++语言按如下要求完成程序。 a) 命令行格式:ip_test subnet/mask ip_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/24 202.113.16.10。(因为255.255.255.0是连续的24个1,所以用24表示)
b) 判断subnet和ip_addr的合法性:
在判断IP地址合法性时要自行编写代码,不要使用任何inet 函数。判断时要考虑各种情况,全面分析问题。例如以下IP地址均不合法: 123..2.1
123.23$.2.1
123.2345.2.1
123.23.45.1
c) 判断掩码的合法性:
譬如说mask的值为负数或者大与32,这时输入的掩码就不合法。
(1) 在IP地址合法,掩码合法以及子网号也合法的前提下,判断ip_addr是否属于subnet。
(2) 输出命令行中的ip是否合法,掩码是否合法,子网号码是否合法(可适当给出不合法的原因)以及ip_addr是否属于子网subnet。
(3) 还可以判断子网号,主机号全0,全1问题。
3 课程设计的相关技术
3.1 IP地址相关概念和知识的回顾
大型的互连网络中应该有一个全局的地址系统,它能够给连接到互联网的每一台主机或者路由器分配一个唯一的全局地址。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地址的结构如下所示;
A类IP地址结构适合用于有大量主机的大型网络。由于主机号长度为24位,因此每个A类网络的主机IP数理论上为224=16777216。
B类IP地址适合用于一些国际性大公司与政府机构等中等大小的组织。由于网络IP长度为14位,因此允许有214=16384个不同的B类网络,实际允许连
接16382个网络。
C类IP地址适合用于一些小公司与普通的研究机构。
3.2 特殊的IP地址形式
(1) 直接广播地址
A类,B类,C类IP地址中主机号全
1的地址称为直接广播地址,用来使路由器将一个分组以广播方式发送给特定网络上的所有主机。直接广播地址只能作为分组中的目的地址。物理网络采用的是点—点传输方式,分组广播需要通过软件来实现。
(2)受限广播地址
网络号与主机号的32位全位1的地址为受限广播地址,用来将一个分组以广播方式发送给本网的所有主机。本网的所有主机将接受该分组,路由器则阻挡该分组通过。
(3) “这个网络上的这台主机”地址
(4)“这个网络上的特定主机”地址
主机或路由器向本网络上的某个特定的主机发送分组,网络号部分为全0,主机号为确定的值。这样的分组被相知在本网络内部。
(5)回送地址
回送地址用于网络软件测试和本地进程见通信。TCP/IP协议规定网络号为
127的分组不能出现在任何网络上;主机和路由器不能为该地址广播任何寻址信息。
3.3 子网的划分
人们在早期设计与建设ARPAnet是,没有预料到网络的发展速度如此之快,应用范围如此之广。当时个人计算机与局域网尚未出现。所以,研究者在设计Internet地址的编址方案时,主要是针对大型互联的网络结构。设计IP地址的最初目的是希望每个IP得志都能唯一地、确定地识别一个网络与一台主机,但是这种方法同时也存在着两个主要的问题,即IP地址的有效利用率和路由器的工作效率。
为了解决这个问题,人们提出了子网(subnet)和超网(supernet)的概念。子网就是一个大的网络划分成几个较小的网络,而每一个小网络都是其自己的地址。超网就是将一个组织所属的几个C类网络合并成为一个更大地址范围的逻辑网络。
划分子网实际上就是在IP地址系统中增加一个层次。三级IP地址的表示方法为netID-subnet ID-host ID。第一级网络号定义了网点的位置;第二级子网号定义了物理子网;第三级主机号定义了主机和路由器到物理网络的连接。三级层次的IP地址,一个IP分组的路由器的过程分为三步:第一步将分组转发给网点,第二步转发给物理子网,第三步转发给确切的主机。
当三级层次的IP地址提出后,一个很显示的问题是:如何从一个IP地址提取出子网号。因此,提出了子网掩码(subnet mask)的概念。子网掩码有时也叫做子网掩码。
子网掩码表示方法:网络号与子网号置1,主机号置0。
如判断某一IP地址是否属于某一子网呢?只需将二进制IP地址与子网掩码按位进行“与”运算。若“与”运算所得值与给定子网地址一致,则说明该IP地址属于给定的子网。
4 课程设计过程
4.1课程设计流程图
4.2 课程设计源代码 #include <iostream.h> #include <string.h> #include <stdlib.h> #include <stdio.h>
#include <math.h> #include <ctype.h> #include <winsock2.h> #include <ws2tcpip.h> #include <time.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib") class ipTest{ //类结构 public:
char ip[15];
char subnetPlusMask[18]; char subnet[18]; char TempIp[15]; l maskIsValid;
int mask;
char Tempsub[18]; ipTest(char *,char *); ~ipTest(){};
bool NoIllegalChar(char *); bool ipIsValid(char *); bool subnetIsValid(char *); void belong(); print();
}; //非法字符的判断 //判断IP地址是否合法 //判断子网号是否合法 //判断IP是否为子网成员
void main(int argc,char * argv[]){ //主函数
}
ipTest::ipTest( char* subnetPlusMask, char *ip){ //构造函数
maskIsValid=true; char temp[2]; if(argc!=3){ //判断参数格式化是否正确 } else{ } if(strlen(argv[1])>18){ //先判断最简单的错误,长度是否超出 } if(strlen(argv[2])>15){ } ipTest test(argv[1],argv[2]); //实例话ipTest类 test.print(); //完成相应判别并输出结果 cout<<"ip is too long"; return; cout<<"subnet/mask is too long"; return; cout<<"error"<<endl<<"format shoud be:ip_test subnet/mask ip"<<endl; return;
int smLen=strlen(subnetPlusMask); //把'/'前的字符复制到subnet字符数组中 for( int i=0; i<smLen && subnetPlusMask[i] !='/'; i++ ){
}
subnet[i]='\0';
Tempsub[i]='\0';
if(i<=smLen-2){ //初始化mask和maskIsVslid this->subnet[i]=subnetPlusMask[i]; this->Tempsub[i]=subnetPlusMask[i];
if(i==smLen-2){ } else if( i == smLen-3 ){ temp[0]=subnetPlusMask[i+1]; if( !isdigit(temp[0]) ) maskIsValid = false;
temp[0]=subnetPlusMask[i+1];
}
}
ipTest::print(){ //调用判别函数,并输出结果
bool subIsV=subnetIsValid(Tempsub); bool ipIsV=ipIsValid(TempIp); if(!subIsV) cout<<"subnet is invalid ! "<<endl; else cout<<"valid subnet: "<<subnet<<endl; if(!maskIsValid) cout<<"mask is invalid!"<<endl; else maskIsValid=false; } mask = atoi(temp); if( mask<0 || mask > 32) maskIsValid = false; temp[1]=subnetPlusMask[i+2]; if( !(isdigit(temp[0])&&isdigit(temp[1])) ) maskIsValid=false; strcpy( this->subnetPlusMask, subnetPlusMask); strcpy( this->ip, ip ); strcpy( this->TempIp, ip );
} else cout<<"valid mask:"<<mask<<endl; if(!ipIsV) else cout<<"valid ip:"<<ip<<endl; cout<<"ip is invalid!"<<endl; //判断IP是否belong subnet if(subIsV&&ipIsV&&maskIsValid) belong();
bool ipTest::NoIllegalChar(char *ch){ //子函数,判断输入是否含有非数字字符
}
bool ipTest::ipIsValid(char * ip){ //判别IP地址是否合法 char ch[]=" .";
char *token,*dot[4];
int iplen=0; token=strtok(ip,ch); //以"."标志将IP字符串按节分开 while(token!=NULL){ //循环进行,知道结束 } dot[iplen]=token; //将分开的每段赋值给dot iplen++; token= strtok(NULL,ch); if(iplen!=4) unsigned int i,k=0; for(i=0;i<strlen(ch);i++){ } return true; if(isdigit(*(ch+i))==0){ } return false; {cout<<this->Tempsub<<endl;
} } return false;} //段数不对 for(int i=0;i<4;i++){ } return true; if(!NoIllegalChar(dot[i])||atoi(dot[i])>255) //有非法字符或某段值非法 return false; bool ipTest::subnetIsValid(char* subnet){ //判断子网号是否合法 if( ! ipIsValid(subnet)) //调用判别IP地址合法性的函数 return false; return true;
//判断IP是否为子网成员,判断子网号与掩码是否匹配,以及子网号、主机号全0全1问题
void ipTest::belong(){ int subLen=strlen(subnet); int ipLen=strlen(ip); unsigned int iIPA,iSubA,iMask; unsigned char subA[4],ipA[4]; char temp[3]; int i,j,t=0; for(i=0,j=0;i<subLen;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 = *( unsigned int *)subA; //iSubA中放subnet中'.'除外的串对应的数 for(i= 0, j= 0, t= 0; i<ipLen; i++){ //不用再检错 } ipA[0] = atoi(temp); iIPA = *( unsigned int* )ipA; //iIPA中放IP中'.'除外的串对应的数 iMask = 0xffffffff; if(ip[i] != '.') temp[j++] = ip[i]; else{ } ipA[3-t] = atoi(temp); j=0; t++; temp[0]=temp[1]=temp[2]='\0'; iMask<<=(32-mask); //获取掩码 } if( ( iSubA ^ iMask ) == 0 ){ //说明子网号全1 } if( ( iSubA & iMask ) == 0 ){ //说明子网号全0 } if( ( iSubA) == (iIPA & iMask) ){ //IP和掩码与,结果和子网号比较 cout<<" 子网号全0,error!"<<endl; return; cout<<" 子网号全1,error!"<<endl; return; if( ( iSubA | iMask ) != iMask ){ //说明sub与mask不匹配 cout<<" 子网号与掩码不匹配,error!"<<endl; return;
} if( ( iIPA | iMask) == iMask ){ //说明主机号全0 } if( ( iIPA | iMask ) == 0xffffffff ){ //说明主机号全1 } cout<<" "<< ip <<" belongs to "<<subnetPlusMask<<endl; return; cout<<" 主机号全1,error!"<<endl; return; cout<<" 主机号全0,error!"<<endl; return; }//ip属于subnet else cout<<" "<< ip <<" doesn't belong to "<<subnetPlusMask<<endl; //ip不属于subnet
4.3 运行结果
(1) 子网号、子网掩码和IP
地址均不合法时:
(2) 子网号、子网掩码和IP地址均合法,且IP地址属于子网号时:
(3) 子网号、子网掩码和IP地址均合法,且IP地址不属于子网号时:
(4) 子网号不合法时:
(5) 掩码不合法时:
(6) IP地址不合法时:
5 课程设计小结
为期一周的计算机网络课程设计终于圆满结束,我所做的课设题目“IP地址的合法性及子网判断”算是比较简单,但是由于对子网掩码等各种概念的不够熟悉,在开始之前我通过课本和网络查找了大量信息,在考虑IP地址(subnet子网地址原理相同)非法的情况时,我们就漏掉了几种情况,这直接导致我们画的流程图以及编写的源代码不完善。经过反复的修改最后才使代码功能完善。在设计好算法后,用C/C++编写源代码以实现算法的过程中,面对如何选择合适的数据结构,我们感到很为难。最后在老师的指导和帮助下才解决。另一方面,在代码的调试过程中,程序出现了很多的Debug,有的是符号的缺省比较简单,但有的比较复杂,自己看不懂,我也请教了很多同学帮忙结局,最后终于搞定了所
有问题,看着最关键的一部分解决了,真让人欣喜。
此次课设也让我体会到了,很多东西说的简单,做的难,看书的同时只有结合动手才能最有效率地提高自己的编程能力。
6 参考文献
[1]谢希仁 《计算机网络》(第五版)电子工业出版社 2008.1
[2]张尧学,郭国强,王晓春,赵艳标 《计算机网络与Internet教程》(第2版)清华大学出版社 2006.11
[3]吴功宜,胡晓英,张仁,何云,王宁
版社 2005.9
机械工业出 《计算机网络课程设计》
本科课程论文评分标准
教师签名: