编写一个判断IP地址是否合法的计算机程序如果合法给出其子网号.docx
《编写一个判断IP地址是否合法的计算机程序如果合法给出其子网号.docx》由会员分享,可在线阅读,更多相关《编写一个判断IP地址是否合法的计算机程序如果合法给出其子网号.docx(9页珍藏版)》请在冰豆网上搜索。
编写一个判断IP地址是否合法的计算机程序如果合法给出其子网号
计算机网络与通信实习报告
实习题目编写判断IP地址是否合法的计算机程序并给出子网号
学生专业班级
学生姓名(学号)
指导教师
完成时间2010年5月21日
实习(设计)地点信息楼139机房
2010年5月21日
一、实验题目
编写一个判断IP地址是否合法的计算机程序,如果合法,给出其子网号
一、原理概述
1.TCP/IP协议的网络层使用的地址标识符叫做IP地址,IPv.4中IP地址是一个32位的二进制地址。
网络中的每一个主机或路由器至少有一个IP地址,在Internet中不允许有两个设备使用相同的IP地址。
如果一台主机或路由器连接到两个或多个物理网络,那么它可以拥有两个或多个IP地址。
IP地址采用分层结构,由网络号和主机号两部分组成(如下图所示):
网络号
主机号
IP地址的长度为32位,用点分十进制表示,格式为x.x.x.x,每个x表示8位,每个x的值为0~255(例如202.133.29.119)。
根据不同的取值范围,IP地址可以氛围五类,IP地址中的前五位用于标识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数理论上为2^24=16777216,由于全0和全不能用,所以每一个A类网络的主机IP数为16777214。
B类IP地址适用于一些国际性大公司与政府机构等中等大小的组织。
由于网络IP长度为14位,因此允许有2^14=16384个不同的B类网络,实际允许连接16382个网络。
C类IP地址适用于一些小公司与普通研究机构。
2.设计IP地址的最初目的是希望每个IP地址都能唯一地、确定地标示一个网络或一台主机,但是这种方法同时也存在着两个重要的问题,即IP地址的有效利用率和路由器的工作效率。
为了解决这个问题,人们提出了子网(subnet)和超网(supernet)的概念。
划分子网实际上就是在IP地址系统中增加一个层次。
三级IP地址的表示方法为netID-subnetID-hostID。
第一级网络号定义了网点的位置;第二级网络号定义了物理子网;第三级主机号定义了主机和路由器到物理网络的连接。
划分子网后原两级IP地址就变成三级的。
子网掩码的表示方法:
网络号和子网号置1,主机号置0。
若要从IP地址中提取出子网号将IP地址与子网掩码相与即可。
二、设计方案
该程序所完成的功能有判断IP地址是否合法,然后输出其子网号。
判断IP地址是否合法比较容易完成,然后把输入的IP地址以数组的形式输出其二进制形式,这牵扯到一个十进制转二进制的程序段。
然后输入子网掩码,并将其转换成二进制。
将IP地址的二进制遇子网掩码的二进制逐位相与,得到的结果就是其子网号,然后需要编写一个二进制转十进制的程序,将子网号以点分十进制的形式输出,即完成实验要求。
1.验证ip地址合法性流程图:
2.验证子网掩码是否正确
三、程序编写
#include
#include
voidmain()
{
intm,i,j,ip[4],ym[4],ymm[4][8],ipp[4][8],t,zw[4],l;
intok[4]={0,0,0,0};
printf("请输入一个IP地址!
\n");
loop:
scanf("%d.%d.%d.%d",&ip[0],&ip[1],&ip[2],&ip[3]);
if((ip[0]>=0&&ip[0]<224)&&(ip[1]>=0&&ip[1]<256)&&(ip[2]>=0&&ip[2]<256)&&(ip[3]>=0&&ip[3]<256))
{if(ip[0]==0&&ip[1]==0&&ip[2]==0&&ip[3]==0)//把地址为全零的IP地址除去
m=0;
else
if(ip[0]==127)//将127.0.0.0去除
m=0;
else
if(ip[1]==255&&ip[2]==255&&ip[3]==255)//将主机号为全1的去除
m=0;
else
if(ip[1]==0&&ip[2]==0&&ip[3]==0)//将主机号为全0的去除
m=0;
else
m=1;
}
elsem=0;
switch(m)//用m的值判断ip地址是否合法,m=0时不合法,m=1时合法
{
case0:
{printf("此地址不合法!
\n");
printf("重新输入请按ENTER,否则请按其他任意键!
\n");
scanf("%d",&l);
if(l==1)
gotoloop;
else
if(l!
=1)break;
}
case1:
{//判断地址的类型
if(ip[0]>0&&ip[0]<127)
printf("此地址为合法的A类地址!
\n");
elseif(ip[0]>127&&ip[0]<192)
printf("此地址为合法的B类地址!
\n");
else
printf("此地址为合法的C类地址!
\n");
//判断地址的类型
//以下程序实现ip地址点分十进制到二进制的转化
printf("其IP地址的二进制表示为:
\n");
for(i=0;i<4;i++)
for(j=7;j>=0;j--)
{ipp[i][j]=ip[i]%2;
ip[i]=ip[i]/2;}
//输出转化以后的ip地址
for(i=0;i<4;i++)
{for(j=0;j<8;j++)
printf("%d",ipp[i][j]);
printf(".");//一个字节输出一个“.”,此处多输出一个“.”
}
printf("\n请输入子网掩码!
\n如:
255.224.0.0\n");
//将十进制子网掩码转化为二进制,存放到ym[4][8]中
scanf("%d.%d.%d.%d",&ym[0],&ym[1],&ym[2],&ym[3]);
printf("\n");
for(i=0;i<4;i++)
for(j=7;j>=0;j--)
{ymm[i][j]=ym[i]%2;
ym[i]=ym[i]/2;}
printf("子网掩码的二进制表示为:
\n");
for(i=0;i<4;i++)
{for(j=0;j<8;j++)
printf("%d",ymm[i][j]);
printf(".");
}
printf("\n");
//实现ip地址与掩码逐位相与
printf("子网号的二进制表示为:
\n");
for(i=0;i<4;i++)
{for(j=0;j<8;j++)
{ymm[i][j]=ymm[i][j]&ipp[i][j];
printf("%d",ymm[i][j]);}
printf(".");
}
printf("\n");
//将相与后的数用十进制输出
printf("子网号的点分十进制表示为:
\n");
for(i=0;i<4;i++)
for(j=0;j<8;j++)
ymm[i][j]=ymm[i][j]*pow((double)2,7-j);
for(i=0;i<4;i++)
for(j=0;j<8;j++)
ok[i]=ymm[i][j]+ok[i];
for(i=0;i<4;i++)
printf("%d.",ok[i]);
//将相与后的数用十进制输出
printf("\n");
}
}
}
四、运行结果
五、实习心的和体会
经过此次实习,对二、十进制之间的转换、IP地址的由来、作用以及分类有了进一步的了解,对IP地址与其掩码、子网号的关系有了较深刻的认识。
实习期间复习了以前学过的C语言受益匪浅。
在本次实习中遇到了很多困难也学到了很多东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,对有关IP地址和子网有了进一步的了解,而且进一步巩固了程序的编写。
在程序设计过程中一直对字符操作不懂的透彻,对子网的输出一直不对,在经历了对课本的查阅以及上网查阅终于找到了解决问题的方法,提高了自己的动手能力和解决问题的能力。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说还是有点困难,对以前所学过的知识理解得不够深刻,掌握得不够牢固,这就造成了微程序理解的困难,比如说……通过这次课程设计之后,一定把以前所学过的知识重新温故。
六、参考文献
[1]计算机网路(第5版)谢希仁电子工业出版社
[2]WINDOWS网络编程黄超北京:
人民邮电出版社.
[3]刘文涛.网络安全开发包详解.北京:
电子工业出版社
[4]《计算机网络》课程设计指导书
实习成绩评定表
学生姓名
专业班级
设计题目
编写一个判断IP地址是否合法的计算机程序,如果合法,给出其子网号
指导教师评语及意见:
指导教师评阅成绩:
指导教师签字:
年月日