ip地址的合法性及子网判断.docx

上传人:b****1 文档编号:23067315 上传时间:2023-04-30 格式:DOCX 页数:19 大小:106.93KB
下载 相关 举报
ip地址的合法性及子网判断.docx_第1页
第1页 / 共19页
ip地址的合法性及子网判断.docx_第2页
第2页 / 共19页
ip地址的合法性及子网判断.docx_第3页
第3页 / 共19页
ip地址的合法性及子网判断.docx_第4页
第4页 / 共19页
ip地址的合法性及子网判断.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

ip地址的合法性及子网判断.docx

《ip地址的合法性及子网判断.docx》由会员分享,可在线阅读,更多相关《ip地址的合法性及子网判断.docx(19页珍藏版)》请在冰豆网上搜索。

ip地址的合法性及子网判断.docx

ip地址的合法性及子网判断

一、课程设计的目的和意义

1.1设计目的

掌握IP地址的分类,准确理解子网、掩码的概念,确切地明了IP地址的合法格式。

并判断该地址是否属于一个给定的子网。

1.2设计的意义

1、有利于对基础知识的理解

2、有利于逻辑思维的锻炼

程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。

即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养。

3、有利于与其他学科的整合

在程序设计中,我们可以解决其它学科有关问题,也利用其它课程的有关知识来解决信息技术中比较抽象很难理解的知识。

在信息技术课中整合其它学科的知识,发挥信息技术的优势。

4、有利于治学态度的培养。

程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。

因此,程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。

这当中就有一个严谨治学、一丝不苟的科学精神的培养。

二、课程设计的内容和要求

在掌握IP地址的表示方法以及子网划分方法的基础上,并以计算机网络中关于IP地址的相关理论知识为基石,运用C/C++语言按如下要求完成程序。

1.在判断一个IP地址合法性时要自行编写代码,不要使用任何inet函数

2.命令行格式:

ip_testsubnet/maskip_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/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问题。

三、课程设计的相关技术

1.IP地址相关概念

 所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。

  按照TCP/IP(TransportControlProtocol/InternetProtocol,传输控制协议/Internet协议)协议规定,IP地址用二进制来表示,每个IP地址长

32bit,比特换算成字节,就是4个字节。

例如一个采用二进制形式的IP地址是“00001010000000000000000000000001”,这么长的地址,人们处理起来也太费劲了。

为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。

于是,上面的IP地址可以表示为“10.0.0.1”。

IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多。

大型的互连网络中应该有一个全局的地址系统,它能够给连接到互联网的每一台主机或者路由器分配一个唯一的全局地址。

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地址的结构如下所示;

0

网络号(7位)

主机号(24位)

10

网络号(14位)

主机号(16位)

110

网络号(21位)

主机号(8位)

1110

组播地址(28位)

11110

保留用于课程设计和将来使用

A类IP地址结构适合用于有大量主机的大型网络。

由于主机号长度为24位,因此每个A类网络的主机IP数理论上为224=16777216。

B类IP地址适合用于一些国际性大公司与政府机构等中等大小的组织。

由于网络IP长度为14位,因此允许有214=16384个不同的B类网络,实际允许连接16382个网络。

C类IP地址适合用于一些小公司与普通的研究机构。

2.特殊的IP地址形式

(1)直接广播地址

A类,B类,C类IP地址中主机号全1的地址称为直接广播地址,用来使路由器将一个分组以广播方式发送给特定网络上的所有主机。

直接广播地址只能作为分组中的目的地址。

物理网络采用的是点—点传输方式,分组广播需要通过软件来实现。

网络号

主机号全1

(2)受限广播地址

网络号与主机号的32位全位1的地址为受限广播地址,用来将一个分组以广播方式发送给本网的所有主机。

本网的所有主机将接受该分组,路由器则阻挡该分组通过。

全1

(3)“这个网络上的这台主机”地址

全0

(4)“这个网络上的特定主机”地址

主机或路由器向本网络上的某个特定的主机发送分组,网络号部分为全0,主机号为确定的值。

这样的分组被相知在本网络内部。

网络号全0

主机号

(5)回送地址

回送地址用于网络软件测试和本地进程见通信。

TCP/IP协议规定网络号为 127的分组不能出现在任何网络上;主机和路由器不能为该地址广播任何寻址信息。

127

任意值(通常取1)

3.子网的划分

人们在早期设计与建设ARPAnet是,没有预料到网络的发展速度如此之快,应用范围如此之广。

当时个人计算机与局域网尚未出现。

所以,研究者在设计Internet地址的编址方案时,主要是针对大型互联的网络结构。

设计IP地址的最初目的是希望每个IP得志都能唯一地、确定地识别一个网络与一台主机,但是这种方法同时也存在着两个主要的问题,即IP地址的有效利用率和路由器的工作效率。

为了解决这个问题,人们提出了子网(subnet)和超网(supernet)的概念。

子网就是一个大的网络划分成几个较小的网络,而每一个小网络都是其自己的地址。

超网就是将一个组织所属的几个C类网络合并成为一个更大地址范围的逻辑网络。

划分子网实际上就是在IP地址系统中增加一个层次。

三级IP地址的表示方法为netID-subnetID-hostID。

第一级网络号定义了网点的位置;第二级子网号定义了物理子网;第三级主机号定义了主机和路由器到物理网络的连接。

三级层次的IP地址,一个IP分组的路由器的过程分为三步:

第一步将分组转发给网点,第二步转发给物理子网,第三步转发给确切的主机。

当三级层次的IP地址提出后,一个很显示的问题是:

如何从一个IP地址提取出子网号。

因此,提出了子网掩码(subnetmask)的概念。

子网掩码有时也叫做子网掩码。

子网掩码表示方法:

网络号与子网号置1,主机号置0。

如判断某一IP地址是否属于某一子网呢?

只需将二进制IP地址与子网掩码按位进行“与”运算。

若“与”运算所得值与给定子网地址一致,则说明该IP地址属于给定的子网。

四.课程设计过程

1、课程设计流程图:

五.程序运行结果

(1)在命令提示窗口中输入命令:

ip_test202.113.16.0/24202.113.16.10

结果如下:

这个结果表示所输入的子网及ip地址是合法的

(2)判断ip地址无效

①在命令提示窗口中输入命令:

ip_test202.113.16.0/24202.113.16.1%

结果如下:

该结果表示所输入ip地址无效,因为ip地址中有无效字符“%”。

②在命令提示窗口中输入命令:

ip_test202.113.16.0/24202.113.16.10.10

结果如下:

由命令可以很明显的看出ip地址过长,说明该程序算法正确。

(3)判断掩码的有效性

①在命令提示窗口中输入命令:

ip_test202.113.16.0/2a202.113.16.10

结果如下:

很显然,掩码中含有“a”,不合法。

②在命令提示窗口中输入命令:

ip_test202.113.16.0/33202.113.16.10

结果如下:

因掩码不能长于32位,上提示掩码无效进一步说明该算法的正确性。

(4)判断ip地址是否属于该子网

①在

(1)中是该ip地址属于该子网的情况

②在命令提示窗口中输入命令:

ip_test202.113.16.0/24202.113.15.10,显然该ip地址不属于该子网。

结果如下:

该结果符合我们的预想。

(5)提示子网号全0或全1

①在命令提示窗口中输入命令:

ip_test0.0.0.0/24202.113.16.10

结果如下:

②在命令提示窗口中输入命令:

ip_test255.255.255.0/24202.113.15.10

结果如下:

(6)判断主机号全0或全1

①在命令提示窗口中输入命令:

ip_test202.113.16.0/24202.113.16.0

结果如下:

②在命令提示窗口中输入命令:

ip_test202.113.16.0/24202.113.16.255

结果如下:

以上现象充分说明该算法是完全正确的。

六、课程设计小结

为期两天的计算机网络课程设计就这样结束了,在整个设计过程中我们遇到了各种意想不到的问题,遍尝了各种滋味,既享受到成功的欢欣,有品尝到失败的懊恼,总之,充满了艰辛,一路上磕磕跘跘,甚是不易。

一开始,老师要我们选择课程设计题目,我们选择了“IP地址的合法性及子网判断”这个题目!

但是,当我们大伙坐下来仔细分析题目时,发现这并没有我们当初想的那么简单,首先,在考虑IP地址(subnet子网地址原理相同)非法的情况时,我们就漏掉了几种情况。

最后,当我们输入命令行进行运行时,却发现不管我们输入的子网地址是否合法,运行结果都显示:

subnetisinvalid。

我们分析了很久也找不到原因,无奈我们再一次寻求同学的帮助。

他只是把整个程序大致浏览了一下就发现了错误,原来我们把charip[15],charsubnetPlusMask[18],charsubnet[18],charTempIp[15]这几个变量设置成了私有变量,导致后面的程序不能访问。

把代码按老师的指导修改后,调试,运行显示的结果准确无误,这才把课程设计的核心——编写源代码搞定。

平常我们都只顾对理论的学习,而没花时间进行实践,课程设计为我们提供了一个把理论知识进行实践的绝好机会,课程设计要求我们既动手有动脑,即要独立思考又要团队配合,锻炼我们的分析实际问题,解决实际问题的能力,提高我们适应实际,实践的能力。

一言以蔽之,我们既要强调对理论知识的学习,又要注重实践,在实践过程中加强对理论知识的理解,使实践与理论学习形成良性循环。

最后,真诚地感谢老师的指导。

七.参考文献

[1]张尧学,郭国强,王晓春,赵艳标。

计算机网络与Internet教程[第2版]。

清华大学出版社,2006,11。

[2]吴功宜,胡晓英,张仁,何云,王宁。

计算机网络课程设计。

机械工业出

八.附录:

课程设计原代码版社,2005,9。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#pragmacomment(lib,"ws2_32.lib")

//类结构

classipTest{

public:

charip[15];

charsubnetPlusMask[18];

charsubnet[18];

charTempIp[15];

lmaskIsValid;

intmask;

charTempsub[18];

ipTest(char*,char*);

~ipTest(){};

boolNoIllegalChar(char*);//非法字符的判断

boolipIsValid(char*);//判断IP地址是否合法

boolsubnetIsValid(char*);//判断子网号是否合法

voidbelong();//判断IP是否为子网成员

print();

}

;

//主函数

voidmain(intargc,char*argv[]){

if(argc!

=3){//判断参数格式化是否正确

cout<<"error"<

ip_testsubnet/maskip"<

return;

}

else{

if(strlen(argv[1])>18){//先判断最简单的错误,长度是否超出

cout<<"subnet/maskistoolong";

return;

}

if(strlen(argv[2])>15){

cout<<"ipistoolong";

return;

}

ipTesttest(argv[1],argv[2]);//实例话ipTest类

test.print();//完成相应判别并输出结果

}

}

//构造函数

ipTest:

:

ipTest(char*subnetPlusMask,char*ip){

maskIsValid=true;

chartemp[2];

//把'/'前的字符复制到subnet字符数组中

intsmLen=strlen(subnetPlusMask);

for(inti=0;i

='/';i++){

this->subnet[i]=subnetPlusMask[i];

this->Tempsub[i]=subnetPlusMask[i];

}

subnet[i]='\0';

Tempsub[i]='\0';

if(i<=smLen-2){//初始化mask和maskIsVslid

if(i==smLen-2){

temp[0]=subnetPlusMask[i+1];

if(!

isdigit(temp[0]))

maskIsValid=false;

}

elseif(i==smLen-3){

temp[0]=subnetPlusMask[i+1];

temp[1]=subnetPlusMask[i+2];

if(!

(isdigit(temp[0])&&isdigit(temp[1])))

maskIsValid=false;

}

mask=atoi(temp);

if(mask<0||mask>32)

maskIsValid=false;

}

else

maskIsValid=false;

strcpy(this->subnetPlusMask,subnetPlusMask);

strcpy(this->ip,ip);

strcpy(this->TempIp,ip);

}

//调用判别函数,并输出结果

ipTest:

:

print(){

boolsubIsV=subnetIsValid(Tempsub);

boolipIsV=ipIsValid(TempIp);

if(!

subIsV)

cout<<"subnetisinvalid!

"<

else

cout<<"validsubnet:

"<

if(!

maskIsValid)

cout<<"maskisinvalid!

"<

else

cout<<"validmask:

"<

if(!

ipIsV)

cout<<"ipisinvalid!

"<

else

cout<<"validip:

"<

//判断IP是否belongsubnet

if(subIsV&&ipIsV&&maskIsValid)

belong();

}

//子函数,判断输入是否含有非数字字符

boolipTest:

:

NoIllegalChar(char*ch){

unsignedinti,k=0;

for(i=0;i

if(isdigit(*(ch+i))==0){

returnfalse;

}

}

returntrue;

}

//判别IP地址是否合法

boolipTest:

:

ipIsValid(char*ip){

charch[]=".";

char*token,*dot[4];

intiplen=0;

token=strtok(ip,ch);//以"."标志将IP字符串按节分开

while(token!

=NULL){//循环进行,知道结束

dot[iplen]=token;//将分开的每段赋值给dot

iplen++;

token=strtok(NULL,ch);

}

if(iplen!

=4)

{cout<Tempsub<

returnfalse;}//段数不对

for(inti=0;i<4;i++){

if(!

NoIllegalChar(dot[i])||atoi(dot[i])>255)//有非法字符或某段值非法

returnfalse;

}

returntrue;

}

//判断子网号是否合法

boolipTest:

:

subnetIsValid(char*subnet){

if(!

ipIsValid(subnet))//调用判别IP地址合法性的函数

returnfalse;

returntrue;

}

//判断IP是否为子网成员,判断子网号与掩码是否匹配,以及子网号、主机号全0全1问题

voidipTest:

:

belong(){

intsubLen=strlen(subnet);

intipLen=strlen(ip);

unsignedintiIPA,iSubA,iMask;

unsignedcharsubA[4],ipA[4];

chartemp[3];

inti,j,t=0;

for(i=0,j=0;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=*(unsignedint*)subA;//iSubA中放subnet中'.'除外的串对应的数

for(i=0,j=0,t=0;i

if(ip[i]!

='.')

temp[j++]=ip[i];

else{

ipA[3-t]=atoi(temp);

j=0;

t++;

temp[0]=temp[1]=temp[2]='\0';

}

}

ipA[0]=atoi(temp);

iIPA=*(unsignedint*)ipA;//iIPA中放IP中'.'除外的串对应的数

iMask=0xffffffff;

iMask<<=(32-mask);//获取掩码

if((iSubA|iMask)!

=iMask){//说明sub与mask不匹配

cout<<"子网号与掩码不匹配,error!

"<

return;

}

if((iSubA^iMask)==0){//说明子网号全1

cout<<"子网号全1,error!

"<

return;

}

if((iSubA&iMask)==0){//说明子网号全0

cout<<"子网号全0,error!

"<

return;

}

if((iSubA)==(iIPA&iMask)){//IP和掩码与,结果和子网号比较

if((iIPA|iMask)==iMask){//说明主机号全0

cout<<"主机号全0,error!

"<

return;

}

if((iIPA|iMask)==0xffffffff){//说明主机号全1

cout<<"主机号全1,error!

"<

return;

}

//ip属于subnet

cout<<""<

return;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1