网络课程报告IP地址的合法及子网判断
- 格式:doc
- 大小:300.00 KB
- 文档页数:46
网络课程报告IP地址的合法及子网判断
中国计量学院
现代科技学院
课程设计报告本
课程设计名称 IP地址的合法性及子网判断系(部)信息系学号
专业计算机姓名
班级 101 指导教师虞戟
2013 年 7 月 5 日
课程设计报告目录
中国计量学院现代科技学院课程设计报告P.1
IP合法性和子网的判断
一、设计的目的和要求
1.目的
掌握IP地址的分类,准确理解子网、掩码的概念,确切地明了IP地址的合法格式。
并判断该地址是否属于一个给定的子网。
判断IP地址属于A B C那类网。
2.要求
根据后面介绍的IP地址与子网划分的知识,编写程序判断IP地址的合法性及属于子网。
1)以命令行形式运行:
IPAddress subnet_address/mask ip_address
其中,IPAddress为程序名,subnet_address为子网地址,mask为掩码,ip_address为IP地址
2)判断IP地址属于A B C那类网。
3)判断subnet和ip_addr的合法性。
在判断IP地址合法性时要自行编写代码,不要使用任何inet 函数。
判断时要考虑各种情况,全面分析问题。
4)判断掩码的合法性。
譬如说mask的值为负数或者大与32,这时输入的掩码就不合法。
5)在IP地址合法,掩码合法以及子网号也合法的前提下,判断ip_addr是否属于subnet。
6)输出命令行中的ip是否合法,掩码是否合法,子网号码是否合法(可适当给出不合法的原因)以及ip_addr是否属于子网subnet。
7)还可以判断子网号,主机号全0,全1问题。
1
中国计量学院现代科技学院课程设计报告P.2 二、设计任务
通过程序正确的实现对IP地址合理性的判断;当给定一IP地址时,本程序能实现对其IP地址、子网地址、掩码的合法性做出正确的判断,以及能判断该IP地址是否属于子网,和IP地址属于A B C哪类网络
三、设计方案分析
(一)总体设计
1.分别输入子网号、掩码和IP地址。
2.分别判断子网号、掩码和IP地址的基本格式是否合法。
3.如果三者的基本格式都合法,才调用判定“IP地址是否为子网成员”的函数。
该函数同时判别子网号与掩码是否匹配,子网号为全0或全1,主机号为全0、全1.
4.如果三者的基本格式都合法,判断IP地址属于A B C哪类网
2
中国计量学院现代科技学院课程设计报告P.3
3
(程序流程图-1)
中国计量学院现代科技学院课程设计报告P.4 (二)模块设计
(模块流程图-2)
四、调试与运行
(一)调试中遇到的问题和解决办法
1.输入命令行进行运行时,却发现不管我们输入的子网地址是否合法,运
行结果都显示:subnet is invalid。
我们分析了很久也找不到原因,无奈我们再一次寻求同学的帮助。
他只是把整个程序大致浏览了一下就发现了错误,原来我们把char ip[15],char subnetPlusMask[18],char subnet[18],char TempIp[15]这几个变量设置成了私有变量,导致后面的程序不能访问。
2.输入192.168.1.0/24 192.168.1.55 显示出现不属于该子网,这是错误的。
然后在(iSubA&iMask)中发现了问题所在。
3.出现很多的地方少了},然后经过我详细的查找得以解决。
4
4.发现很多词语没有定义,然后经过查找发现定义类时,单词打错了。
中国计量学院现代科技学院课程设计报告P.5(二)运行说明
程序编译成功后,打开cmd,然后打入cd d:/kcsj/debug(程序生成的Debug 文件路径下),再进行打入TestIP(程序文件名)192.168.1.0/24 192.168.1.55(IPAddresssubnet_address/mask ip_address) ,然后会出现运行结果,查看IP地址IP地址、子网地址、掩码的合法性,以及能判断该IP地址是否属于子网,和IP地址属于A B C那类网络。
(三)运行效果展示
(1)在命令提示窗口中输入命令:TestIP 192.1/33 198.1.1;
TestIP 256.1.1.0/24 256.1.1.55
详细的判断IP地址、子网地址、掩码的合法性
5
中国计量学院现代科技学院课程设计报告P.6
TestIP 19.16.1.0/24 19.16.1.55
(2)在命令提示窗口中输入命令:
(3)在命令提示窗口中输入命令:
TestIP 192.16.1.0/24 168.125.168.192
6
中国计量学院现代科技学院课程设计报告P.7(4)在命令提示窗口中输入命令:TestIP 192.168.1.0/24 192.168.2.55
IP地址不属于该子网,并且IP地址属于C类网
(5)在命令提示窗口中输入命令:TestIP 192.168.1.0/24 192.168.1.55
IP地址属于该子网,并且IP地址属于C类网
中国计量学院现代科技学院课程设计报告P.8
五、设计体会与建议
这次课程设计,我收获了很多东西。
通过上网和到图书馆查阅资料,我更加深入的学习了C语言,并利用所学知识设计,充分锻炼,增强了我的程序设计能力,使我加深了对理论知识的理解和掌握。
充分体会到了理论固然重要,如果没有实践去验证,那也只是停在理论层面上,它的现实意义将无法得到体现。
所以,这次课程设计是理论与实践的结合,增强了我在这方面的能力。
通过这次课程设计,我更加深刻的理解了IP地址的合法性,IP地址与子网的从属关系,子网与子网掩码的关系。
在判断IP地址是否属于一个子网时,我对IP地址的分类以及子网划分有了更加深刻的理解。
在这次课程设计的过程中,我遇到了很多问题,但经过老师和同学的帮助,我解决了这些问题,并学到了很多知识,在此,对老师和同学表示真挚的感谢。
附录一:参考文献
[1] 魏权龄.数据包络分析(DEA)[J].科学通报,2000,45(17):1793-1808.
[2] 张尧学,郭国强,王晓春,赵艳标。
计算机网络与Internet教程[第2版]。
清华大学出版社,2006,11。
[3] 谢希仁,计算机网络(第5版),电子工业出版社,2008-01
[4] 谢希仁,计算机网络释疑与习题解答,电子工业出版社,2011-04
[5] 谭浩强,C++程序设计,清华大学出版社,2004-06
中国计量学院现代科技学院课程设计报告P.9
附录二:源代码
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
using namespace std;
//ipTest类定义
class ipTest{
char ip[15]; //用于存放ip地址
char ip_Temp[15]; //用于存放ip地址
char subnet_mask[18]; //用于存放subnet_mask地址
char subnet[18]; //用于存放subnet地址
char subnet_Temp[18]; //用于存放subnet地址
int mask; //用于存放mask(1的个数)
bool maskIsValid; //用于判断的个数是否合适,或是否与subnet匹配
public:
ipTest(char *,char *); //自定义初始化类函数
~ipTest(){}; //析构函数
bool ipIsValid(char *); //判断ip是否合法
bool subnetIsValid(char *); //判断子网号subnet是否合法
bool NoIllegalChar(char *); //ip,subnet地址中非法字符的判断
bool maskIsMatSubnet(int,char *);//判断mask与subnet是否匹配
void AllJudgment(); //判断mask,subnet,ip的合法性问题
void print(); //判断ip是否为子网成员,并输出判断结果
void split(char *,int *); //把单个字符地址转换为十进制数值型地址(含四段)
int toBinary(int a); //十进制int型数据转换为二进制int型数据
char * toString(int *a);//把二进制int型数据转换为一个整体的二进制字符型数据
};
//main主函数
int main(int argc,char *argv[]) //自动读取数据
{
//cout<<"目录地址:"<<argv[0]<<endl; //argv[0]表示ipTest.exe的保存目录地址
中国计量学院现代科技学院课程设计报告P.10
cout<<"subnet_mask : "<<argv[1]<<endl; //argv[1]表示第二个参数,即subnet/mask
cout<<"ip地址: "<<argv[2]<<endl<<endl;//argv[2]表示第三个参数,即ip
//判断段数是否输入合法
if(argc!=3) //argc表示输入的参数个数,无参数输入时,其值为,因为默认argv[0]总是有的
{
cout<<"输入非法!";
return 0;
}
else
{
//先简单判断subnet/mask的长度
if(strlen(argv[1])>18)
{
cout<<"subnet/mask 输入非法!";
system("pause");
return 0;
}
//先简单判断ip的长度
if(strlen(argv[2])>15)
{
cout<<"ip 输入非法!";
system("pause");
return 0;
}
}
ipTest test(argv[1],argv[2]); //实例化类,传
入两个参数
test.AllJudgment();//调用函数,判断mask,subnet,ip的合法性问题
system("pause");//系统暂停
return 0;
}
//构造函数
中国计量学院现代科技学院课程设计报告P.11
ipTest::ipTest(char *subnet_mask,char *ip) {
maskIsValid=true; //设置maskIsValid默认为合法
char temp[2];//定义变量
int i,len;
len=strlen(subnet_mask);
/*******************从subnet/mask中分离出subnet地址***************/
for(i=0;i<len && subnet_mask[i]!='/';i++)
{
this->subnet[i]=subnet_mask[i];
this->subnet_Temp[i]=subnet_mask[i];
}
subnet_Temp[i]='\0';
subnet[i]='\0';
/**************************判断mask 是否为数值************************/
if((len-(i+1)<3&&len-(i+1)>0)) //判断mask是否为一/二位字节
{
if(len-(i+1)==1) //表明mask是一位
{
temp[0]=subnet_mask[i+1];
//判断字符是否为数值型字符
if(!isdigit(temp[0])) //isdigit()为库函
数,可以调用
{
cout<<"mask中含有非数字的非法字符,error!"<<endl;
maskIsValid=false; //mask不是数值,则设置为false
}
}
else if((len-3)==i) //表明mask是二位
{
temp[0]=subnet_mask[i+1];
temp[1]=subnet_mask[i+2];
if(!(isdigit(temp[0]) && isdigit(temp[1])))
{
cout<<"mask中含有非数字的非法字符,error!"<<endl;
中国计量学院现代科技学院课程设计报告P.12
maskIsValid=false;
}
}
mask=atoi(temp); //自动把数字字符转换为对应的十进制数值的函数
if(mask<0 || mask>32)
maskIsValid=false;
}
else //表明mask为空或字节超出范围
{
cout<<"mask为空或超出范围,error!"<<endl;
maskIsValid=false; //若mask是三位数,则表明mask输入非法(其实为~32)}
/*****************************************
***************************/
strcpy(this->subnet_mask,subnet_mask); //给subnet_mask赋值
strcpy(this->ip,ip); //给ip赋值
strcpy(this->ip_Temp,ip); //给ip_temp赋值
}
//判断mask,subnet,ip的合法性问题
void ipTest::AllJudgment()
{
//设置标志subnet地址是否合法的bool型变量,并调用subnetIsValid函数判断
bool
subnetIsV=subnetIsValid(subnet_Temp);
//设置标记ip地址是否合法的bool型变量,并调用ipIsValid函数判断
bool ipIsV=ipIsValid(ip_Temp);
//设置标记mask与subnet地址是否匹配的bool型变量,并调用maskIsMatSubnet函数判断bool
maskIsMatSub=maskIsMatSubnet(mask,subnet _Temp);
cout<<endl;
/************************判断返回的值是否为真******************/
中国计量学院现代科技学院课程设计报告P.13
if(!maskIsValid) //表示返回的maskIsValid是false
{
cout<<"mask error!(mask为整数并在-32范围内)"<<endl;
}
/*
else
{
cout<<"mask合法!"<<endl;
}
*/
/*
if(!maskIsMatSub)
{
//表示返回的maskIsMatSub是false
cout<<"mask与subnet不匹配,error!"<<endl;
}
else
{
cout<<"mask与subnet匹配!"<<endl;
}
*/
if(!subnetIsV)
{
//表示返回的subnetIsV是false
cout<<"subnet error!"<<endl;
}
/*
else
{
cout<<"subnet地址合法!"<<endl; }
if(!ipIsV)
{
//表示返回的ipIsV是false
cout<<"ip地址非法!"<<endl;
中国计量学院现代科技学院课程设计报告P.14 }
else
{
cout<<"ip地址合法!"<<endl;
}
*/
//都合法
if(maskIsValid && maskIsMatSub && subnetIsV && ipIsV)
{
print();
}
}
//判断mask与subnet是否匹配
bool ipTest::maskIsMatSubnet(int mask,char *subnet_Temp)
{
int nbsubnet[4];//用于放十进制的各段地址
//调用把单个字符地址转换为十进制数值型地址(含四段)的函数,实现转换
split(subnet_Temp,nbsubnet);
//subnet是A类地址
if(nbsubnet[0]>0 && nbsubnet[0]<127 &&
mask<8)
{
//mask的值小于
cout<<"mask与subnet不匹配,error!"<<endl;
return false;
}
//subnet是B类地址
if(nbsubnet[0]>=128 && nbsubnet[0]<=191 && mask<16)
{
//mask的值小于
cout<<"mask与subnet不匹配,error!"<<endl;
return false;
}
//subnet是C类地址
if(nbsubnet[0]>=192 && nbsubnet[0]<=223 && mask<24)
{
中国计量学院现代科技学院课程设计报告P.15 //mask的值小于
cout<<"mask与subnet不匹配,error!"<<endl;
return false;
}
//mask与subnet地址匹配
return true;
}
//把单个字符地址转换为十进制数值型地址(含四段)
void ipTest::split(char *chaddr,int *addr) {
char ch[]=" .";
char *token,*dot[4];
int iplen=0;
token=strtok(chaddr,ch);
while(token!=NULL)
{
dot[iplen]=token;
addr[iplen]=atoi(dot[iplen]);//atoi()函数把字符数值转换为int型数值
iplen++;
token=strtok(NULL,ch);
}
}
//ip,subnet地址中非法字符的判断
bool ipTest::NoIllegalChar(char *ch)
{
int i,len=strlen(ch);
for(i=0;i<len;i++)
{
if(ch[i]-'0'>9 || ch[i]-'0'<0)
{
return false;
}
}
中国计量学院现代科技学院课程设计报告P.16 return true;
}
//判断ip是否合法
bool ipTest::ipIsValid(char *ip)
{
char ch[]=" .";
char ip_one[18];
strcpy(ip_one,ip);
char *token,*dot[4];
int iplen=0;
//库函数strtok(),以ch[]为界限来分段token=strtok(ip_one,ch);
while(token!=NULL)
{
dot[iplen]=token;
iplen++;
token=strtok(NULL,ch);//此时,第一个参数必须换为NULL
}
if(iplen!=4)
{
cout<<"地址"<<ip<<"的段数不是,error!"<<endl;
return false;
}
int j,t=0;
for(j=0;j<=strlen(ip);j++)
{
if(ip[j]=='.')
{
t++;
}
}
if(t!=3)
中国计量学院现代科技学院课程设计报告P.17 {
cout<<"地址"<<ip<<"中的'.'不是,error!"<<endl;
return false;
}
int i;
for(i=0;i<iplen;i++)
{
if(!NoIllegalChar(dot[i]) || atoi(dot[i])>255)
{
if(!NoIllegalChar(dot[i])) //判断含有非法字符
cout<<"地址"<<ip<<"中含有非数
字的非法字符,error!"<<endl;
if(atoi(dot[i])>255) //判断数值溢出
cout<<"地址"<<ip<<"中含有不在-255间的数字,error!"<<endl;
return false;
}
}
int flag=1;//首先设置为非法,即全
for(i=0;i<iplen;i++)
{
if(atoi(dot[i])!=0)
{
//含有非的字段
flag=0;
}
}
if(flag==1)
{
cout<<"地址"<<ip<<"全为全,error!"<<endl;
return false;
}
中国计量学院现代科技学院课程设计报告P.18
flag=1;//首先设置为非法,即全
for(i=0;i<iplen;i++)
{
if(atoi(dot[i])!=255)
{
flag=0;
}
}
if(flag==1)
{
cout<<"地址"<<ip<<"全为
return false;
}
int j1=0,j2;
if(ip==ip_Temp)
{
//首先判断ip是哪类地址
if(atoi(dot[0])>0&&atoi(dot[0])<127)
//A类ip地址
{
j1=1; //直接从开始
cout<<"Ip地址属于A类网"<<endl;
}
if(atoi(dot[0])==127) //为的特殊号
{
cout<<"ip地址"<<ip<<"网络号
return false;
}
if(atoi(dot[0])>=128&&atoi(dot[0])<=191) //B类ip地址
{
j1=2;
cout<<"Ip地址属于B类网"<<endl;
}
中国计量学院现代科技学院课程设计报告P.19
if(atoi(dot[0])>=192&&atoi(dot[0])<=223) //C类ip地址
{
j1=3;
cout<<"Ip地址属于c类网"<<endl;
}
if(atoi(dot[0])>223&&atoi(dot[0])<255)
{
cout<<"请重新输入ip地址"<<ip<<",仅限于A,B和C类ip地址,error!"<<endl;
return false;
}
if(atoi(dot[0])==255)
{
cout<<"ip地址"<<ip<<"网络号全为1,error!"<<endl;
return false;
}
j2=j1; //j1用于判断全情况,j1用于判断全情况的起始下标
int flag=1;//首先设置为非法,即主机号全
for(i=j1;i<iplen;i++)
{
if(atoi(dot[i])!=0)
{
flag=0;
}
}
flag=1;//首先设置为非法,即全
for(i=j2;i<iplen;i++)
{
if(atoi(dot[i])!=255)
{
中国计量学院现代科技学院课程设计报告P.20 flag=0;
}
}
if(flag==1)
{
cout<<"ip地址"<<ip<<"的主机号全,error!"<<endl;
return false;
}
}
return true;
}
//判断子网号subnet是否合法
bool ipTest::subnetIsValid(char *subnet) {
if(!ipIsValid(subnet)) //调用判断Ip的函数ipIsValid()进行判断
{
return false;
}
return true;
}
//判断ip是否为子网成员,并输出判断结果void ipTest::print()
{
char subnet_one[15],ip_one[15];
int nbip[4],nbsubnet[4],i;
strcpy(subnet_one,subnet); //把subnet 地址复制给subnet_one
strcpy(ip_one,ip); //把ipt地址复制给ip_one
//split()函数把字符型的地址转换为四段int 型的地址
split(subnet_one,nbsubnet); //用subnet_one而非subnet是为了保护subnet地址中国计量学院现代科技学院课程设计报告P.21 不被破坏
split(ip_one,nbip);
for(i=0;i<4;i++)
{
nbip[i]=toBinary(nbip[i]);//将分离出来的十进制转换为二进制
nbsubnet[i]=toBinary(nbsubnet[i]);
}
char *cbip=new char[33];
char *cbsubnet=new char[33];
cbip=toString(nbip);//将二进制数组转换为位的二进制字符指针
cbsubnet=toString(nbsubnet);
for(i=0;i<mask;i++)
{
if(cbip[i]!=cbsubnet[i])
{
cout<<endl<<"IP地址:"<<ip<<"不属于"<<subnet<<"这一子网"<<endl;
//system("pause");
return;
}
}
cout<<endl<<"IP地址:"<<ip<<"属于"<<subnet<<"这一子网"<<endl;
//system("pause");
}
//十进制int型数据转换为二进制int型数据int ipTest:: toBinary(int a)
{
//将十进制数转换为二进制数
if(a/2==0) return a%2;
return a%2+toBinary(a/2)*10; //递归调用
}
中国计量学院现代科技学院课程设计报告P.22
//把二进制int型数据转换为一个整体的二进制字符型数据
char * ipTest::toString(int *a)
{
//将二进制的数值数组转换个字符长的字符指针
char *temp=new char[33]; int i;
bool flag=false;
char *eight=new char(),*seven=new char(),*six=new char(),*five=new char(),*four=new char(),
*three=new char(),*two=new char(),*one=new char();
for(i=0;i<4;i++)
{
//char *itoa(int value,char *string,int radix)将整数value转换成字符串存入string,radix为转换时所用基数
itoa(a[i]/10000000,eight,10); //产生每段二进制字符地址的最高位
itoa(a[i]/1000000%10,seven,10);
itoa(a[i]/100000%10,six,10);//a[i]/100000%10为每段的高第三位二进制整数
itoa(a[i]/10000%10,five,10);
itoa(a[i]/1000%10,four,10);
itoa(a[i]/100%10,three,10);
itoa(a[i]/10%10,two,10);
itoa(a[i]%10,one,10);
if(flag==true)
{
strcat(temp,eight);
}
else
{
//第一次循环时,执行此步骤;同时置flag=true保证以后循环不执行此步
strcpy(temp,eight); //第一次循环的第
一次传递用连接函数
flag=true;
}
strcat(temp,seven); strcat(temp,six); strcat(temp,five);
strcat(temp,four);
strcat(temp,three); strcat(temp,two); strcat(temp,one);
}
return temp;
}
课程设计报告评语
成绩评定:
指导教师:
年月日。