课程设计任务书
目录
一 课程设计目的和意义 ................................................................................................................. 3
1.1设计目的...........................................................................................................................3 1.2设计的意义 ...................................................................................................................... 3 二 协议的内容说明,关键技术的说明 ......................................................................................... 4
2.1 ip地址简介 ...................................................................................................................... 4 2.2 子网掩码简介 ................................................................................................................. 5 2.3 ip地址的计算 .................................................................................................................. 6 2.4 子网划分简介 ................................................................................................................. 7 3.1主程序设计..................................................................................... ................................. 8 3.2验证ip地址合法性 ......................................................................................................... 8 3.3验证ip是否属于某个子网 ..........................................................................................9
3.4代码 ................................................................................................................................... 10 四 程序的运行和调试结果 ......................................................................................................... 19
运行结果 ................................................................................................................................. 19 五 课程设计小结 ........................................................................................................................... 21 六 参考文献 ................................................................................................................................... 21
一 课程设计目的和意义
1.1设计目的
1.加深对IP地址及subnet的认识; 2.了解IP地址的划分;
3. 了解subnet的作用和产生因素,subnet的划分; 4. 实际操作编写规则,匹配IP和subnet,加深理解
1.2设计的意义
1、有利于基础知识的理解
通过《计算机网络》的学习,学生掌握了一些信息时代生存与发展必需的信息技术基础知识和基本技能,具备了在日常生活与学习中应用信息技术解决问题的基本态度与基本能力。但是,学生对于程序、病毒的内涵,程序与文档、数据的区别,计算机运行的机理等知识内容的理解比较肤浅。学生如果接触了程度设计,就能真正理解,从而进一步打破计算机的神秘感。 2、有利于逻辑思维的锻炼
程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养。 3、有利于与其他学科的整合
在程序设计中,我们可以解决其它学科有关问题,也利用其它课程的有关知识来解决信息技术中比较抽象很难理解的知识。在信息技术课中整合其它学科的知识,发挥信息技术的优势。
4、有利于治学态度的培养。
程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。因此,程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。这当中就有一个严谨治学、一丝不苟的科
学精神的培养,又有一个不怕失败、百折不挠品格的锻炼。
二 协议的内容说明,关键技术的说明
2.1 ip地址简介
所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。 按照TCP/IP(Transport Control Protocol/Internet Protocol,传输控制协议/Internet协议)协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。例如一个采用二进制形式的IP地址是“00001010000000000000000000000001”,这么长的地址,人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”。IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多。
有人会以为,一台计算机只能有一个IP地址,这种观点是错误的。我们可以指定一台计算机具有多个IP地址,因此在访问互联网时,不要以为一个IP地址就是一台计算机;另外,通过特定的技术,也可以使多台服务器共用一个IP地址,这些服务器在用户看起来就像一台主机似的。
将IP地址分成了网络号和主机号两部分,设计者就必须决定每部分包含多少位。网络号的位数直接决定了可以分配的网络数(计算方法2^网络号位数);主机号的位数则决定了网络中最大的主机数(计算方法2^主机号位数-2)。然而,由于整个互联网所包含的网络规模可能比较大,也可能比较小,设计者最后聪明的选择了一种灵活的方案:将IP地址空间划分成不同的类别,每一类具有不同的网络号位数和主机号位数。 1.A类IP地址
一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围1.0.0.1-126.255.255.254(二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110)。可用的A类网络有126个,每个网络能容纳1600多万个主机。 2.B类IP地址
一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最
高位必须是“10”,地址范围128.1.0.1-191.254.255.254(二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111110 11111111 11111110)。可用的B类网络有16382个,每个网络能容纳6万多个主机 。 3.C类IP地址
一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围192.0.1.1-223.255.255.254(二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110)。C类网络可达209万余个,每个网络能容纳254个主机。 4.D类地址用于多点广播(Multicast)。
D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。 地址范围224.0.0.1-239.255.255.254 5.E类IP地址
以“11110”开始,为将来使用保留。 E类地址保留,仅作实验和开发用。
全零(“0.0.0.0”)地址指任意网络。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。
2.2 子网掩码简介
通过 IP 地址的二进制与子网掩码的二进制进行与运算进行定某个设备的网络地址,
也就是说通过子网掩码分辨一个网络的网络部分和主机部分子网掩码一旦设置,网络地址和主机地址就固定了。
相对于使用子网掩码来识别网络地址,早期的使用类别进行网络地址的分类存在着地址大量浪费的不足。
子网一个最显著的特征就是具有子网掩码。与IP地址相同,子网掩码的长度也是32位,也可以使用十进制的形式。例如,为二进制形式的子网掩码:11111111111111111111111100000000,采用十进制的形式为:255.255.255.0。
用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。
2.3 ip地址的计算
定义子网掩码的步骤为:
A、确定哪些组地址归我们使用。比如我们申请到的网络号为 “210.73.a.b”,该网络地址为C类IP地址,网络标识为“210.73.a”,主机标识为“.b”。
B、根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们现在需要12个子网,将来可能需要16个。用第三个字节的前四位确定子网掩码。前四位都置为“1”(即把第三字节的最后四位作为主机位,其实在这里有个简单的规律,非网络位的前几位置1原网络就被分为2的几次方个网络,这样原来网络就被分成了2的4次方16个子网),即第三个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。
C、把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0”,则子网掩码的间断二进制形式为:“11111111.11111111.11110000.00000000” D、把这个数转化为间断十进制形式为:“255.255.240.0” 这个数为该网络的子网掩码。
子网掩码一共分为两类。一类是缺省子网掩码,一类是自定义子网掩码。缺省子网掩码即未划分子网,对应的网络号的位[1][2]都置1,主机号都置0。 A类网络缺省子网掩码:255.0.0.0 B类网络缺省子网掩码:255.255.0.0 C类网络缺省子网掩码:255.255.255.0
自定义子网掩码是将一个网络划分为几个子网,需要每一段使用不同的网络号或子网号,实际上我们可以认为是将主机号分为两个部分:子网号、子网主机号。 形式如下: 未做子网划分的ip地址:网络号+主机号
做子网划分后的ip地址:网络号+子网号+子网主机号
也就是说ip地址在化分子网后,以前的主机号位置的一部分给了子网号,余下的是子网主机号。子网掩码是32位二进制数,它的子网主机标误用部分为全“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
2.4 子网划分简介
子网的划分,实际上就是设计子网掩码的过程。子网掩码主要是用来区分IP地址中的网络ID和主机ID,它用来屏蔽IP地址的一部分,从IP地址中分离出网络ID和主机ID.子网掩码是由4个十进制数组成的数值"中间用"。"分隔,如255.255.255.0。若将它写成二进制的形式为:11111111.11111111.11111111.00000000,其中为"1"的位分离出网络ID,为"0"的位分离出主机ID,也就是通过将IP地址与子网掩码进行"与"逻辑操作,得出网络号。
例如,假设IP地址为192.160.4.1,子网掩码为255.255.255.0,则网络ID为192.160.4.0,主机ID为0.0.0.1。计算机网络ID的不同,则说明他们不在同一个物理子网内,需通过路由器转发才能进行数据交换。
每类地址具有默认的子网掩码:对于A类为255.0.0.0,对于B类为255.255.0.0,对于C类为255.255.255.0。除了使用上述的表示方法之外,还有使用于网掩码中"1"的位数来表示的,在默认情况下,A类地址为8位,B类地址为16位,C类地址为24位。例如,A类的某个地址为 12.10.10.3/8,这里的最后一个"8"说明该地址的子网掩码为8位,而199.42.26.0/28表示网络199.42.26.0的子网掩码位数有28位。
如果希望在一个网络中建立子网,就要在这个默认的于网掩码中加入一些位,它减少了用于主机地址的位数。加入到掩码中的位数决定了可以配置的于网。因而,在一个划分了子网的网络中,每个地址包含一个网络地址、一个子网位数和一个主机地址,
三 程序设计方法、流程图和主要代码
3.1主程序设计
3.1.1设计方法:实现判断输出命令行中的ip是否合法,掩码是否合法以及ip_addr是否是属于子网subnet。将IP地址一位位与子网掩码做与运算,看结果是否和子网相等来判断IP地址是否属于某一个网络。在这个设计中考虑到了以上的种种情况,根据用户输入的IP地址,掩码和子网,程序可以判断输入的IP地址,掩码和子网是否正确以及ip_addr是否是属于子网subnet。
3.1.2主程序流程图
图1 IP地址合法性判断及子网判断主流程图
3.2验证ip地址合法性
3.2.1设计方法:首先检查IP地址的合法性。在判断不合法IP时要考虑全面,比如以下情况均属于不合法
连续两个 . 123..2.1.2 含有非法字符 123.23$.2.1 每部分长度超过3 123.2345.2.1 含有超过三个的. 123.23.45.2.1
3.2.2验证IP地址合法性流程图
图2 验证ip地址合法性流程图
3.3验证ip是否属于某个子网
3.3.1设计方法:输入IP地址,子网掩码和子网地址接着拆分IP地址与子网掩码拆分IP地址和子网掩码进行与运算,结果与子网比较得出是否是一个网络的结论
3.3.2验证IP是否属于某个子网流程图
图3 验证ip是否属于某个子网流程图3.4代码
#include<iostream> #include<ctype.h> #include<math.h> #include<string> using namespace std;
int a[4]={0,0,0,0}; //分段存放子网 char Ip_addr[15]; //ip地址 char sub_net[15]; //子网 int ip[4]={0,0,0,0};
int subnet[4]={0,0,0,0}; //分段存放ip地址
int address[4]={0,0,0,0};
int num; //子网掩码 int toBinary(int a) {//将十进制数转换为二进制数 if(a/2==0) return a%2; return a%2+toBinary(a/2)*10; }
//判断IP是否合法 void aa(char c[15])
{ //判断IP地址不能超过15 if(strlen(c)>15)
{cout<<endl<<"IP地址总长度不能超过15!"<<endl; return; } int dotnum=0;
//判断IP地址中是否存在非法字符 for(int i=0;i<strlen(c);i++)
{ if(isdigit(c[i])==0 && c[i]!='.')
{ cout<<endl<<"IP地址中含有非法字符!"<<endl; return ; } if(c[i]=='.')
dotnum++; } //判断IP地址中只能存在3个分隔符 if(dotnum!=3)
{ cout<<endl<<"IP地址中分隔符只能为3个!"<<endl; return; }
//判断IP地址中是否存在连续分隔符 for(i=0;i<strlen(c)-1;i++)
{ if(c[i]=='.' && c[i+1]=='.')
{ cout<<endl<<"IP地址中出现连续的分隔符!"<<endl;
return; } }} //分割IP地址 void bb(char c[15])
{ //判断IP地址中最后不能为分隔符 for(int m=0;m<4;m++)
{ ip[m]=0; } int len; len=strlen(c); if(c[len-1]=='.')
{ cout<<endl<<"IP地址最后们不能为分隔符!"<<endl; return; }
char temp[4][15]; for(int i=0;i<4;i++) for(int j=0;j<15;j++)
temp[i][j]='\0'; int j=0; i=0;
for(int k=0;k<strlen(c);k++) { if(c[k]!='.')
{ temp[i][j]=c[k]; j++; } else { i++; j=0; } }
for(i=0;i<4;i++)
{ //判断每位的长度 len=strlen(temp[i]); if(len>3)
{ cout<<endl<<"IP地址每位长度不能超过3!"<<endl; return; }
switch(len) { case 3:
{ while(len!=0)
{ ip[i]+=(temp[i][len-1]-48)*pow(10,3-len); len--; } break; } case 2:
{ while(len!=0)
{ ip[i]+=(temp[i][len-1]-48)*pow(10,2-len); len--; }
break; } default:
{ while(len!=0)
{ ip[i]+=(temp[i][len-1]-48)*pow(10,1-len); len--; }
} } } long int num=0; for(i=0;i<4;i++)
{ //判断每位的大小不超过255 if(ip[i]>255)
{ cout<<endl<<"IP地址数字不能超过255!"<<endl; return; } } }
//分割网络地址 void ee(char c[15])
{ //判断网络地址中最后不能为分隔符 for(int m=0;m<4;m++) { subnet[m]=0; } int len; len=strlen(c); if(c[len-1]=='.')
{ cout<<endl<<"子网号最后们不能为分隔符!"<<endl; return; }
char temp[4][15]; for(int i=0;i<4;i++) for(int j=0;j<15;j++) temp[i][j]='\0'; int j=0; i=0;
for(int k=0;k<strlen(c);k++) { if(c[k]!='.')
{ temp[i][j]=c[k]; j++; } else { i++;
j=0; } }
for(i=0;i<4;i++)
{ //判断每位的长度 len=strlen(temp[i]); if(len>3)
{ cout<<endl<<"子网号每位长度不能超过3!"<<endl; return; }
switch(len) { case 3:
{ while(len!=0)
{ subnet[i]+=(temp[i][len-1]-48)*pow(10,3-len); len--; } break; } case 2:
{ while(len!=0)
{ subnet[i]+=(temp[i][len-1]-48)*pow(10,2-len); len--; } break; } default:
{ while(len!=0)
{ subnet[i]+=(temp[i][len-1]-48)*pow(10,1-len);
len--; } } } } long int num=0; for(i=0;i<4;i++)
{ //判断每位的大小不超过255 if(subnet[i]>255)
{ cout<<endl<<"子网号数字长度不能超过255!"<<endl; return; } }} //生成子网掩码 void cc()
{ cout<<"子网掩码为:"; int r[32];
for(int i=0;i<num;i++) { r[i]=1; } for(int j=0;j<32-num;j++) { r[i++]=0; } int p=0; int w[8]; int k=0;
for(int m=0;m<4;m++) { int sum=0;
for (int n=0;n<8;n++) { w[p]=r[k];
sum=sum+w[p]*pow(2,7-n); p++; k++;