武汉理工大学计算机网络课程设计中国好学长系列之小灰灰的爸爸Word格式文档下载.docx
《武汉理工大学计算机网络课程设计中国好学长系列之小灰灰的爸爸Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《武汉理工大学计算机网络课程设计中国好学长系列之小灰灰的爸爸Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
subnet为子网号;
mask是一个数值,代表子网掩码连续1的个数;
ip_addr是要测试的IP地址。
例如,要测试的IP地址为202.114.16.10,子网号为202.113.16.0,子网掩码为255.255.255.0,则命令行为ip_test202.113.16.0/24202.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编写目的
(1)掌握IP地址、子网划分等基本概念。
(2)尝试编程判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网。
2设计的意义
通过本课程的学习,我们掌握了一些信息时代生存与发展必需的信息技术基础知识和基本技能,具备了在日常生活与学习中应用信息技术解决问题的基本态度与基本能力。
但是,学生对于程序、病毒的内涵,程序与文档、数据的区别,计算机运行的机理等知识内容的理解比较肤浅。
学生如果接触了程度设计,就能真正理解,从而进一步打破计算机的神秘感。
程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。
即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养。
在实际编程实现中,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。
因此,程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。
所以通过实践我们才能真正掌握知识运用知识。
3内容和要求
在掌握IP地址的表示方法以及子网划分方法的基础上,并以计算机网络中关于IP地址的相关理论知识为基石,运用C/C++语言按如下要求完成程序。
(1)在判断一个IP地址合法性时要自行编写代码,不要使用任何inet函数
(2)命令行格式:
ip_testsubnet/maskip_addr
其中,ip_test为程序名;
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表示)
(3)判断subnet和ip_addr的合法性
在判断IP地址合法性时要自行编写代码,不要使用任何inet
函数。
判断时要考虑各种情况,全面分析问题。
例如以下IP地址均不合法:
123..2.1
123.23$.2.1
123.2345.2.1
123.23.45.1
(4)判断掩码的合法性
譬如说mask的值为负数或者大与32,这时输入的掩码就不合法。
(5)在IP地址合法,掩码合法以及子网号也合法的前提下,判断ip_addr是否属于subnet。
(6)输出命令行中的ip是否合法,掩码是否合法,子网号码是否合法(可适当给出不合法的原因)以及ip_addr是否属于子网subnet。
(7)还可以判断子网号,主机号全0,全1问题。
4相关技术
4.1ip地址简介
所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。
按照TCP/IP(TransportControlProtocol/InternetProtocol,传输控制协议/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(二进制表示为:
00000001000000000000000000000001-01111110111111111111111111111110)。
可用的A类网络有126个,每个网络能容纳1600多万个主机。
(2)B类IP地址
一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围128.1.0.1-191.254.255.254(二进制表示为:
10000000000000010000000000000001-10111111111111101111111111111110)。
可用的B类网络有16382个,每个网络能容纳6万多个主机。
(3)C类IP地址
一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。
范围192.0.1.1-223.255.255.254(二进制表示为:
11000000000000000000000100000001-11011111111111111111111011111110)。
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”)是当前子网的广播地址。
4.2子网掩码简介
通过IP地址的二进制与子网掩码的二进制进行与运算进行定某个设备的网络地址,也就是说通过子网掩码分辨一个网络的网络部分和主机部分。
子网掩码一旦设置,网络地址和主机地址就固定了。
相对于使用子网掩码来识别网络地址,早期的使用类别进行网络地址的分类存在着地址大量浪费的不足。
子网一个最显著的特征就是具有子网掩码。
与IP地址相同,子网掩码的长度也是32位,也可以使用十进制的形式。
例如,为二进制形式的子网掩码:
111111*********11111111100000000,采用十进制的形式为:
255.255.255.0。
用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。
在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。
4.3ip地址的计算
定义子网掩码的步骤为:
(1)确定哪些组地址归我们使用。
比如我们申请到的网络号为“210.73.a.b”,该网络地址为C类IP地址,网络标识为“210.73.a”,主机标识为“.b”。
(2)根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。
比如我们现在需要12个子网,将来可能需要16个。
用第三个字节的前四位确定子网掩码。
前四位都置为“1”(即把第三字节的最后四位作为主机位,其实在这里有个简单的规律,非网络位的前几位置1原网络就被分为2的几次方个网络,这样原来网络就被分成了2的4次方16个子网),即第三个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。
(3)把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0”,则子网掩码的间断二进制形式为:
“11111111.11111111.11110000.00000000”
(4)把这个数转化为间断十进制形式为:
“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地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
4.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。
除了使用上述的表示方法之外,还有使用于网掩码中"
的位数来表示的,在默认情况下,A类地址为8位,B类地址为16位,C类地址为24位。
例如,A类的某个地址为12.10.10.3/8,这里的最后一个"
8"
说明该地址的子网掩码为8位,而199.42.26.0/28表示网络199.42.26.0的子网掩码位数有28位。
如果希望在一个网络中建立子网,就要在这个默认的于网掩码中加入一些位,它减少了用于主机地址的位数。
加入到掩码中的位数决定了可以配置的于网。
因而,在一个划分了子网的网络中,每个地址包含一个网络地址、一个子网位数和一个主机地址
5程序设计方法
5.1主程序设计
5.1.1设计方法
实现判断输出命令行中的ip是否合法,掩码是否合法以及ip_addr是否是属于子网subnet。
将IP地址一位位与子网掩码做与运算,看结果是否和子网相等来判断IP地址是否属于某一个网络。
在这个设计中考虑到了以上的种种情况,根据用户输入的IP地址,掩码和子网,程序可以判断输入的IP地址,掩码和子网是否正确以及ip_addr是否是属于子网subnet。
5.1.2主程序流程图
图1 IP地址合法性判断及子网判断主流程图
5.2验证ip地址合法性
5.2.1设计方法
首先检查IP地址的合法性。
在判断不合法IP时要考虑全面,比如以下情况均属于不合法
连续两个.123..2.1.2
含有非法字符123.23$.2.1
每部分长度超过3123.2345.2.1
含有超过三个的.123.23.45.2.1
5.2.2验证IP地址合法性流程图
图2 验证ip地址合法性流程图
5.3验证ip是否属于某个子网
5.3.1设计方法
输入IP地址,子网掩码和子网地址接着拆分IP地址与子网掩码拆分IP地址和子网掩码进行与运算,结果与子网比较得出是否是一个网络的结论
5.3.2验证IP是否属于某个子网流程图
图3 验证ip是否属于某个子网流程图
6代码
#include<
iostream>
ctype.h>
math.h>
string>
usingnamespacestd;
inta[4]={0,0,0,0};
//分段存放子网
charIp_addr[15];
//ip地址
charsub_net[15];
//子网
intip[4]={0,0,0,0};
intsubnet[4]={0,0,0,0};
//分段存放ip地址
intaddress[4]={0,0,0,0};
intnum;
//子网掩码
inttoBinary(inta)
{//将十进制数转换为二进制数
if(a/2==0)returna%2;
returna%2+toBinary(a/2)*10;
}
//判断IP是否合法
voidIP_right(charc[15])
{
//判断IP地址不能超过15
if(strlen(c)>
15)
{cout<
<
endl<
IP地址总长度不能超过15!
endl;
return;
}
intdotnum=0;
//判断IP地址中是否存在非法字符
for(inti=0;
i<
strlen(c);
i++)
{if(isdigit(c[i])==0&
&
c[i]!
='
.'
)
{cout<
IP地址中含有非法字符!
return;
if(c[i]=='
dotnum++;
//判断IP地址中只能存在3个分隔符
if(dotnum!
=3)
IP地址中分隔符只能为3个!
//判断IP地址中是否存在连续分隔符
for(i=0;
strlen(c)-1;
{if(c[i]=='
&
c[i+1]=='
IP地址中出现连续的分隔符!
}}
//分割IP地址
voidfenge_IP(charc[15])
{
//判断IP地址中最后不能为分隔符
for(intm=0;
m<
4;
m++)
{ip[m]=0;
intlen;
len=strlen(c);
if(c[len-1]=='
IP地址最后们不能为分隔符!
chartemp[4][15];
for(intj=0;
j<
15;
j++)
temp[i][j]='
\0'
;
intj=0;
i=0;
for(intk=0;
k<
k++)
{if(c[k]!
{temp[i][j]=c[k];
j++;
else
{i++;
j=0;
}}
{
//判断每位的长度
len=strlen(temp[i]);
if(len>
3)
IP地址每位长度不能超过3!
switch(len)
{case3:
{while(len!
=0)
{ip[i]+=(temp[i][len-1]-48)*pow(10,3-len);
len--;
break;
case2:
{ip[i]+=(temp[i][len-1]-48)*pow(10,2-len);
default:
{ip[i]+=(temp[i][len-1]-48)*pow(10,1-len);
}}}
longintnum=0;
//判断每位的大小不超过255
if(ip[i]>
255)
IP地址数字不能超过255!
//分割网络地址
voidfenge_subnet(charc[15])
//判断网络地址中最后不能为分隔符
{subnet[m]=0;
子网号最后不能为分隔符!
子网号每位长度不能超过3!
{subnet[i]+=(temp[i][len-1]-48)*pow(10,3-len);
{subnet[i]+=(temp[i][len-1]-48)*pow(10,2-len);
{subnet[i]+=(temp[i][len-1]-48)*pow(10,1-len);
}
if(subnet[i]>
子网号数字长度不能超过255!
//生成子网掩码
voidmask()
{cout<
子网掩码为:
intr[32];
num;
{r[i]=1;
32-num;
{r[i++]=0;
intp=0;
intw[8];
intk=0;
{intsum=0;
for(intn=0;
n<
8;
n++)
{w[p]=r[k];
sum=sum+w[p]*pow(2,7-n);
p++;
k++;
p=0;
a[m]=sum;
for(intn=0;
a[n];
if(n!
."
cout<
//判断是否和子网相等
voidjudge()
{strings="
{if((a[i]&
ip[i])==subnet[i])
{s=s+"
a"
由IP和子网掩码得到的网络地址:
{
intw1=toBinary(a[i]);
intw2=toBinary(ip[i]);
w1&
w2;
//如果存在4个a
结果:
if(s=="
aaaa"
{cout