第三章 IP地址的合法性及子网判断
3.1 课程设计目的
本设计要求编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定子网。从而考察读者是否对IP地址概念及其子网划分有非常清楚的认识。
3.2 课程设计要求
在掌握IP地址表示方法及子网划分方法的基础上,按如下要求完成程序。 1) 命令行格式: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_test 202.113.16.0、24 202.113.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。
A类,B类与C类IP地址中主机号权1的地址chengweizhijieguangbo地址,用来使路由器将一个分组以广播方式发送给特定网络上的所有主机。直接广播地址只能作为分组中的目的地址。物理网络采用的使点-点传输方式,分组广播需要通过软件来实现。
网络号 主机号全1 2)受限广播地址
网络号与主机号的32位全为1的地址为受限广播地址,用来将一个分组以广播方式发送给本网的所有主机。本网的所有主机将接受该分组,路由器则阻挡该分组通过。
全1 3)“这个网络上的这台主机”地址
全0 4)”这个网络上的特定主机”
主机或路由器向本网络上的某个特定的主机发送分组,网络号部分为全0,主机号为确定的值。这样的分组被限制在本网络内部。
网络号全0 5)回送地址
回送地址用于网络软件测试和本地进程间通信。TCP/IP协议规定网络号为127的分组不能出现在任何网络上;主机和路由器不能为该地址广播任何寻址信息。
127 任意值(通常取1) 主机号 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地址属于给定的子网。
3.4 课程设计分析
1.程序大致流程
1)分别判断子网号,掩码和IP地址的基本格式是否合法。
2)如果三者的基本格式都合法,才调用判定“IP地址是否为子网成员”的函数。该函数同时判别子网号与掩码是否匹配,子网号为全0或全1,主机号为全0,全1.
2.核心代码及说明
1)判断IP地址是否合法。
一般来说,我们先检查最明显的错误。例如,可以先判断IP中”.”个数是否正确;接着,以“.”为标志将IP字符串按节分开;然后,看该IP是否为4段,再判断各节是否是0~255间的整数。关于网络号,主机号全0全1等问题要在后面结合子网掩码一起判断。
这里的关键是怎么将IP字符串以“.”为标志按节分开,这要用到函数strtok(char*strToken,const char*strDelimit).第一个参数是给定的串,第二个参数是分隔符集合,该函数的功能就是以strDelimit中包含的任意字符为分隔符,在strToken中寻找下一个token。每一次调用strtok后,都会在strToken中插入一个NULL字符,所以,如果要读取下一个token,接下来调用strtok时第一个参数用NULL。
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); }
这样,IP串的每一段都放到dot数组里了,下面判断是否有非法字符,每一段的值是否在0~255之间,就很容易了。
2) 判断IP地址是否为子网成员,判断子网号与掩码是否匹配,以及子网号,主机号全0,全1问题(iSubA是子网号,iMask是掩码,iIPA是给定的IP地址)。
if((iSubA|iMask!=imask){ //说明sub与mask不匹配 cout<<”子网号与掩码不匹配,error!”< if((iSubA^iMask)==0){ //说明子网号全1 cout<<”子网号全1,error!”< if((iSubA&iMask)==0){ //说明子网号全0 cout<<”子网号全0,error!”< if((iSubA)==(iIPA&iMask)){ //ip和掩码做“与”运算,结果和子网号比较 if((iIPA|iMask)==iMask){ //说明主机号全0 cout<<”主机号全0,error!”< } if((iIPA|iMask)==0xffffffff){ //说明主机号全1 cout<<”主机号全1,error!”< cout<<””< cout<<””< 实际上,我们可以对IP地址进行更细致的检查。前面给出的方法是根据“分隔符”给IP分段,其实这样做不太准确。因为这种做法不能找出202..113.25.99.这样的错误。要实现这种判断就不能简单地用strtok函数来给IP地址分段了。 另外,还可以根据所给地址判断该IP地址属于A,B,C中的哪类。 #include class ipTest{ char ip[15]; char subnetPlusMask[18]; char subnet[18]; char TempIp[15]; char TempSub[18]; int mask; bool maskIsValid; public:
相关推荐: