IP地址的合法性与子网判断.docx
- 文档编号:3537274
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:9
- 大小:19.03KB
IP地址的合法性与子网判断.docx
《IP地址的合法性与子网判断.docx》由会员分享,可在线阅读,更多相关《IP地址的合法性与子网判断.docx(9页珍藏版)》请在冰豆网上搜索。
IP地址的合法性与子网判断
一、 课程设计目的
掌握IP地址的分类,准确理解子网、掩码的概念,确切地明了IP地址的合法格式。
并判断该地址是否属于一个给定的子网。
二、设计的意义
1、有利于对基础知识的理解
2、有利于逻辑思维的锻炼
程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。
即使一个简单的程序,从任务分析、确定算法、界面布局、编写代码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽象思维训练,也有分析问题、解决问题、预测目标等能力的培养。
3、有利于与其他学科的整合
在程序设计中,我们可以解决其它学科有关问题,也利用其它课程的有关知识来解决信息技术中比较抽象很难理解的知识。
在信息技术课中整合其它学科的知识,发挥信息技术的优势。
4、有利于治学态度的培养。
程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。
因此,程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。
这当中就有一个严谨治学、一丝不苟的科学精神的培养。
三、 课程设计的内容和要求
在掌握IP地址的表示方法以及子网划分方法的基础上,并以计算机网络中关于IP地址的相关理论知识为基石,运用C/C++语言按如下要求完成程序。
1.在判断一个IP地址合法性时要自行编写代码,不要使用任何inet函数
2.命令行格式:
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_test202.113.16.0/24 202.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问题。
四、课程设计代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragmacomment(lib,"ws2_32.lib")//静态加入一个库文件
//类结构
classipTest{//定义一个类的,类的名字为ipTest
public:
charip[15];//用于存放ip地址
charsubnetPlusMask[18];//用于存放subnetPlusMask地址
charsubnet[18];//用于存放subnet地址
charTempIp[15];//用于存放ip地址
boolmaskIsValid;//用于判断的个数是否合适,或是否与subnet匹配
intmask;//用于存放mask
charTempsub[18];//用于存放subnet地址
ipTest(char*,char*);//自定义初始化类函数
~ipTest(){};//析构函数
boolNoIllegalChar(char*);//ip,subnet地址中非法字符的判断
boolipIsValid(char*);//判断ip是否合法
boolsubnetIsValid(char*);//判断子网号subnet是否合法
voidbelong();//判断IP是否为子网成员
print();//判断ip是否为子网成员,并输出判断结果
}
;
//主函数
voidmain(intargc,char*argv[]){//自动读取数据
if(argc!
=3){//判断参数格式化是否正确
cout<<"pleaseinputcommand:
ip_testsubnet/maskip";//输出语句
return;
}
else
{
if(strlen(argv[1])>18){//先判断最简单的错误,subnet/mask长度是否超出
cout<<"subnet/maskistoolong";//输出语句
return;
}
if(strlen(argv[2])>15){//判断ip的长度
cout<<"ipistoolong";//输出语句
return;
}
ipTesttest(argv[1],argv[2]);//实例话ipTest类
test.print();//完成相应判别并输出结果
}
}
//ip地址类构造函数
ipTest:
:
ipTest(char*subnetPlusMask,char*ip){
maskIsValid=true;//设置maskIsValid默认为合法
chartemp[2];//定义变量
//把'/'前的字符复制到subnet字符数组中
intsmLen=strlen(subnetPlusMask);//取出subnetPlusMask[]的长度
for(inti=0;i ='/';i++){//从subnet/mask中分离出subnet地址 this->subnet[i]=subnetPlusMask[i];//取出数组subnetPlusMask[i]的值赋给subnet[i] this->Tempsub[i]=subnetPlusMask[i];//取出数组subnetPlusMask[i]的值赋给Tempsub[i] } subnet[i]='\0'; Tempsub[i]='\0'; if(i<=smLen-2){//判断mask是否为一位还是两位数 if(i==smLen-2)//表明mask是一位 { temp[0]=subnetPlusMask[i+1]; if(! isdigit(temp[0]))//判断subnetPlusMask[i+1]是否是数字 maskIsValid=false;//掩码是否有效做标记 } else { if(i==smLen-3)//表明mask是二位 { temp[0]=subnetPlusMask[i+1];//把mask存到temp数组里 temp[1]=subnetPlusMask[i+2]; if(! (isdigit(temp[0])&&isdigit(temp[1]))) maskIsValid=false;//把maskIsValid不合法 } } mask=atoi(temp);//自动把数字字符转换为对应的十进制数值的函数 if(mask<0||mask>32)//判断掩码的范围是否合法 maskIsValid=false; } else//表明mask为空或字节超出范围 maskIsValid=false;//若mask是三位数,则表明mask输入非法 strcpy(this->subnetPlusMask,subnetPlusMask);//给subnet_mask赋值 strcpy(this->ip,ip);//给ip赋值 strcpy(this->TempIp,ip);//给TempIp赋值 } //判断mask,subnet,ip的合法性问题 ipTest: : print(){ boolsubIsV=subnetIsValid(Tempsub);//设置标志subnet地址是否合法的bool型变量,并调用subnetIsValid函数判断 boolipIsV=ipIsValid(TempIp);//设置标记ip地址是否合法的bool型变量并调用ipIsValid函数判断 if(! subIsV)//判断子网是否合法 cout<<"subnetisinvalid! "< else cout<<"validsubnet: "< if(! maskIsValid)//表示返回的maskIsValid是false cout<<"maskisinvalid! "< else cout<<"validmask: "< if(! ipIsV)//判断ip是否合法 cout<<"ipisinvalid! "< else cout<<"validip: "< //判断IP是否belongsubnet if(subIsV&&ipIsV&&maskIsValid) belong();//调用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)//判断ip的段数是否是四段 { cout< 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);//取出子网的长度赋给sublen intipLen=strlen(ip);//取出ip地址的长度赋给iplen unsignedintiIPA,iSubA,iMask; unsignedcharsubA[4],ipA[4];//定义字符数组变量 chartemp[3];//定义temp数组 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数组的字符型数组转换成长整型 temp[0]=temp[1]=temp[2]='\0';//清空数组temp中的数据 iSubA=*(unsignedint*)subA;//iSubA中放subnet中'.'除外的串对应的数 for(i=0,j=0,t=0;i if(ip[i]! ='.')//判断ip数组中的字符是不是"." temp[j++]=ip[i];//把ip数组里面的数据存到temp数组里 else{ ipA[3-t]=atoi(temp);//把temp数组中的字符型数组转换成长整型赋给ipA数组 j=0;//清空数据 t++; temp[0]=temp[1]=temp[2]='\0'; } } ipA[0]=atoi(temp);//把temp数组中的字符型数组转换成长整型赋到ipA数组里面 iIPA=*(unsignedint*)ipA;//iIPA中放IP中'.'除外的串对应的数 iMask=0xffffffff;//初始化iMask的值 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; } //ip不属于subnet else cout<<""< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IP 地址 合法性 子网 判断