XXXXXX 大学 XXXXXXX 学院
计算机网络与通信实习报告
设 计 题 目 编程判断IP 地址的合法性
学生专业班级
学生姓名(学号)
指 导 教 师
完 成 时 间 2010-5-22
实 习(设计)地点 信息楼139、112
2010年 5月 22日
一.实习题目
编写一个判断IP 地址是否合法的计算机程序,如果合法,给出其子网号。 二.原理概述
在计算机网络中,主要分为三类IP 地址,即A 类,B 类,C 类地址,每一类地址都有其特点和寻址原则。每个IP 地址均有32位,8个为一段,共四个字节。每段范围在0~255,超出这个范围就是错误的。子网掩码是一个32位地址,用于屏蔽IP 地址的一部分以区别网络标识和主机标识,并说明该IP 地址是在局域网上,还是在远程网上。子网掩码的计算根据其具体算法来计算。 1.三类地址的特点: 1.1 A 类IP 地址
2.2主机寻址规则
主机标识在同一网络内必须是唯一的。
主机标识的各个位不能都为“1”,如果所有位都为“1”,则该机地址是广播地址,而非主机的地址。
主机标识的各个位不能都为“0”,如果各个位都为“0”,则表示“只有这个网络”,而这个网络上没有任何主机。 3.IP 子网掩码概述 3.1 子网掩码的概念
子网掩码是一个32位地址,用于屏蔽IP 地址的一部分以区别网络标识和主机标识,并说明该IP 地址是在局域网上,还是在远程网上。 3.2 确定子网掩码数
用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。 定义子网掩码的步骤为:
①确定哪些组地址归我们使用。比如我们申请到的网络号为 “210.73.a.b”,该网络地址为c 类IP 地址,网络标识为“210.73”,主机标识为“a.b”。
②根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们现在需要12个子网,将来可能需要16个。用第三个字节的前四位确定子网掩码。前四位都置为“1”,即第三个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。
③把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0”,则子网掩码的间断二进制形式为:“11111111.11111111.11110000.00000000” ④把这个数转化为间断十进制形式为:“255.255.240.0” 三.设计方案 1.实验开发环境
Microsoft Visual C++6.0来实现这个系统。 2. 系统分析及函数说明
为了避免使系统使用过多重复的代码以及增加程序的可读性我们可以定义一个类
结构ipTest ;输入的字符串需要判断是否是只是数字而不是其他的不合法字符我们就需要定义一个NoIllegalChar()来判断其输入的串是否是字符;要判断IP 地址及子网号是否合法我们就需要设计一个函数来判断IP 地址及子网号是否正确的函数我们设函数分别为ipIsValid()和subnetIsValid();判断Ip 是否属于该子网号我们用函数belong();最后我们需要输出结果我们就使用print()来实现又好的输出。其详细的函数及功能如下:
NoIllegalChar(char *):判断包括是否有非法字符、段值是否为四 ipIsValid(char *):判断IP 地址是否合法也包括非法字符、段值的判断 subnetIsValid(char *):判断子网号是否合法也包括非法字符、段值的判断 belong():判断IP 是否为子网成员,判断子网号与掩码是否匹配,以及子网号、
主机号全0全1问题
print():定义输出函数print 。
3.程序流程图 a 、主流程图
b 、验证ip 地址合法性流程图
c 、验证子网掩码合法性流程图
四.程序编写
1.判断IP 地址是否合法
#include #include int main() {
char str[31],temp[31]; //定义IP 地址为32位的字符类型
int a,b,c,d; //定义IP 地址的四个字节为a,b,c,d ,并且均为整型的
Printf(“请输入IP 地址”)
while(gets(str) != NULL) {
if(scanf(str,"%d.%d.%d.%d",&a,&b,&c,&d)==4 && a>=0 && a=0 && b=0 && c
&& d>=0 && d
printf(temp,"%d.%d.%d.%d",a,b,c,d); if(strcmp(temp,str)==0) {
printf("IP地址合法\n"); } else {
printf("IP地址不合法\n"); } } else {
printf("IP地址不合法\n"); } }
return 0; }
2.判断IP 是否为子网成员,判断子网号与掩码是否匹配,以及子网号、主机号全0全1问题
if(!ipIsValid(subnet)) //调用判别IP 地址合法性的函数 return false; return true;
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=*(unsigned int *)subA; //iSubA中放subnet 中'.' 除外的串对应的数
for(i=0,j=0,t=0;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=*(unsigned int*)ipA; //iIPA中放IP 中'.' 除外的串对应的数
iMask = 0xffffffff; iMask
if((iSubA | iMask)!= iMask) { //说明sub 与mask 不匹配 } if((iSubA^iMask)==0) { //说明子网号全1 } if((iSubA&iMask)==0) { //说明子网号全0 }
if((iSubA)==(iIPA&iMask))
{ //IP和掩码与,结果和子网号比较 if((iIPA|iMask)==iMask) { //说明主机号全0 }
if((iIPA|iMask)==0xffffffff) { //说明主机号全1 } //ip属于subnet }
//ip不属于subnet else
cout
}
五.运行结果
1. 测试Ip 地址是否合法如图
分析:IP 地址不符合格式要求!
分析:子网号出现了“$”字符,其为非法字符,所以出错!
分析:子网号的段数不是四,所以出错!
分析:IP 地址段数不是四,所以出错! 2. 简单判断子网号及掩码长度是否超出范围如图
分析:因为程序里设置的子网号和掩码字符串长度最多是18个字符而这里有20个字符大于18,所以出错!
分析:程序中的IP 地址字符串最长只有15个而程序中有17个字符大于15个,所以出错!
3. 测试子网号与掩码是否匹配如图
分析:子网号转换为二进制:00000000 11000000 00000000 00000000
子网掩码转换成二进制:11111111 10000000 00000000 00000000
从以上可以看出子网号与子网掩码不匹配与输出结果是一样的说明程序算法是正确的!
分析:子网号转换为二进制:00000000 10000000 00000000 00000000
子网掩码转换成二进制:11111111 10000000 00000000 00000000
从以上可以看出子网号与子网掩码匹配与输出结果是一样的说明程序算法是正确的! 六.实习心得与体会
历经一周的时间,通过对该课程的设计,使我对IP 地址的形成及合法性有深层次的理解。对子网判断有个清晰的认识;即计算机网络的IP 地址主要分为三类,A,B,C 三类。一个主机号由网络号和主机号两大部分组成,子网号是在主机号中抽出几位来作为子网号的。相同的子网掩码可以有不同的网络地址。此次课程设计让我能够将所学知识融会贯通、进一步系统化,进一步提高软件设计的能力,为以后的更高一级的软件设计打下坚实基础。
在课程设计的最初阶段我遇到了一些问题,比如我不确定用哪一种语言编写试验程序更简洁明了,在充分比较了VB 和C 语言后,我发现对C 语言的掌握程度远比VB 要
好,而且C 语言的语句比较简洁,符合编程的一般常理,最终我决定用C 语言进行整个的编程。确定好实验开发环境之后,我开始着手实验题目的分析与实验原理相关知识的储备,通过查阅计算机网络课本及网上资源的利用,初步掌握了IP 地址及子网掩码的相关概念。接下来我开始复习C 语言的一些编程语句及编程技巧,根据实验的要求着手编写试验程序。在程序的调试过程中遇到的问题是最多的,比如类型不匹配,某一个变量没有定义等,但在错误提示下,逐一进行改错。然后将运行结果进行截图。最后在课程设计的要求下写实习报告。
在整个实习的过程中,我体会到了编程的严谨性,对我的分析能力有很大的提高,这将对我今后的学习有莫大的帮助!
参考文献:
1、计算机网络(第五版) 谢希仁 电子工业出版社 2008年10月版 2、C 程序设计(第三版)谭浩强 清华大学出版社 2005年7月版 3、《网络编程与开发技术》 殷肖川、刘志宏、姬伟峰、万映辉 西安交通大学出版社 2003年9月版
课程设计成绩评定表
XXXXXX 大学 XXXXXXX 学院
计算机网络与通信实习报告
设 计 题 目 编程判断IP 地址的合法性
学生专业班级
学生姓名(学号)
指 导 教 师
完 成 时 间 2010-5-22
实 习(设计)地点 信息楼139、112
2010年 5月 22日
一.实习题目
编写一个判断IP 地址是否合法的计算机程序,如果合法,给出其子网号。 二.原理概述
在计算机网络中,主要分为三类IP 地址,即A 类,B 类,C 类地址,每一类地址都有其特点和寻址原则。每个IP 地址均有32位,8个为一段,共四个字节。每段范围在0~255,超出这个范围就是错误的。子网掩码是一个32位地址,用于屏蔽IP 地址的一部分以区别网络标识和主机标识,并说明该IP 地址是在局域网上,还是在远程网上。子网掩码的计算根据其具体算法来计算。 1.三类地址的特点: 1.1 A 类IP 地址
2.2主机寻址规则
主机标识在同一网络内必须是唯一的。
主机标识的各个位不能都为“1”,如果所有位都为“1”,则该机地址是广播地址,而非主机的地址。
主机标识的各个位不能都为“0”,如果各个位都为“0”,则表示“只有这个网络”,而这个网络上没有任何主机。 3.IP 子网掩码概述 3.1 子网掩码的概念
子网掩码是一个32位地址,用于屏蔽IP 地址的一部分以区别网络标识和主机标识,并说明该IP 地址是在局域网上,还是在远程网上。 3.2 确定子网掩码数
用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。 定义子网掩码的步骤为:
①确定哪些组地址归我们使用。比如我们申请到的网络号为 “210.73.a.b”,该网络地址为c 类IP 地址,网络标识为“210.73”,主机标识为“a.b”。
②根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们现在需要12个子网,将来可能需要16个。用第三个字节的前四位确定子网掩码。前四位都置为“1”,即第三个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。
③把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0”,则子网掩码的间断二进制形式为:“11111111.11111111.11110000.00000000” ④把这个数转化为间断十进制形式为:“255.255.240.0” 三.设计方案 1.实验开发环境
Microsoft Visual C++6.0来实现这个系统。 2. 系统分析及函数说明
为了避免使系统使用过多重复的代码以及增加程序的可读性我们可以定义一个类
结构ipTest ;输入的字符串需要判断是否是只是数字而不是其他的不合法字符我们就需要定义一个NoIllegalChar()来判断其输入的串是否是字符;要判断IP 地址及子网号是否合法我们就需要设计一个函数来判断IP 地址及子网号是否正确的函数我们设函数分别为ipIsValid()和subnetIsValid();判断Ip 是否属于该子网号我们用函数belong();最后我们需要输出结果我们就使用print()来实现又好的输出。其详细的函数及功能如下:
NoIllegalChar(char *):判断包括是否有非法字符、段值是否为四 ipIsValid(char *):判断IP 地址是否合法也包括非法字符、段值的判断 subnetIsValid(char *):判断子网号是否合法也包括非法字符、段值的判断 belong():判断IP 是否为子网成员,判断子网号与掩码是否匹配,以及子网号、
主机号全0全1问题
print():定义输出函数print 。
3.程序流程图 a 、主流程图
b 、验证ip 地址合法性流程图
c 、验证子网掩码合法性流程图
四.程序编写
1.判断IP 地址是否合法
#include #include int main() {
char str[31],temp[31]; //定义IP 地址为32位的字符类型
int a,b,c,d; //定义IP 地址的四个字节为a,b,c,d ,并且均为整型的
Printf(“请输入IP 地址”)
while(gets(str) != NULL) {
if(scanf(str,"%d.%d.%d.%d",&a,&b,&c,&d)==4 && a>=0 && a=0 && b=0 && c
&& d>=0 && d
printf(temp,"%d.%d.%d.%d",a,b,c,d); if(strcmp(temp,str)==0) {
printf("IP地址合法\n"); } else {
printf("IP地址不合法\n"); } } else {
printf("IP地址不合法\n"); } }
return 0; }
2.判断IP 是否为子网成员,判断子网号与掩码是否匹配,以及子网号、主机号全0全1问题
if(!ipIsValid(subnet)) //调用判别IP 地址合法性的函数 return false; return true;
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=*(unsigned int *)subA; //iSubA中放subnet 中'.' 除外的串对应的数
for(i=0,j=0,t=0;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=*(unsigned int*)ipA; //iIPA中放IP 中'.' 除外的串对应的数
iMask = 0xffffffff; iMask
if((iSubA | iMask)!= iMask) { //说明sub 与mask 不匹配 } if((iSubA^iMask)==0) { //说明子网号全1 } if((iSubA&iMask)==0) { //说明子网号全0 }
if((iSubA)==(iIPA&iMask))
{ //IP和掩码与,结果和子网号比较 if((iIPA|iMask)==iMask) { //说明主机号全0 }
if((iIPA|iMask)==0xffffffff) { //说明主机号全1 } //ip属于subnet }
//ip不属于subnet else
cout
}
五.运行结果
1. 测试Ip 地址是否合法如图
分析:IP 地址不符合格式要求!
分析:子网号出现了“$”字符,其为非法字符,所以出错!
分析:子网号的段数不是四,所以出错!
分析:IP 地址段数不是四,所以出错! 2. 简单判断子网号及掩码长度是否超出范围如图
分析:因为程序里设置的子网号和掩码字符串长度最多是18个字符而这里有20个字符大于18,所以出错!
分析:程序中的IP 地址字符串最长只有15个而程序中有17个字符大于15个,所以出错!
3. 测试子网号与掩码是否匹配如图
分析:子网号转换为二进制:00000000 11000000 00000000 00000000
子网掩码转换成二进制:11111111 10000000 00000000 00000000
从以上可以看出子网号与子网掩码不匹配与输出结果是一样的说明程序算法是正确的!
分析:子网号转换为二进制:00000000 10000000 00000000 00000000
子网掩码转换成二进制:11111111 10000000 00000000 00000000
从以上可以看出子网号与子网掩码匹配与输出结果是一样的说明程序算法是正确的! 六.实习心得与体会
历经一周的时间,通过对该课程的设计,使我对IP 地址的形成及合法性有深层次的理解。对子网判断有个清晰的认识;即计算机网络的IP 地址主要分为三类,A,B,C 三类。一个主机号由网络号和主机号两大部分组成,子网号是在主机号中抽出几位来作为子网号的。相同的子网掩码可以有不同的网络地址。此次课程设计让我能够将所学知识融会贯通、进一步系统化,进一步提高软件设计的能力,为以后的更高一级的软件设计打下坚实基础。
在课程设计的最初阶段我遇到了一些问题,比如我不确定用哪一种语言编写试验程序更简洁明了,在充分比较了VB 和C 语言后,我发现对C 语言的掌握程度远比VB 要
好,而且C 语言的语句比较简洁,符合编程的一般常理,最终我决定用C 语言进行整个的编程。确定好实验开发环境之后,我开始着手实验题目的分析与实验原理相关知识的储备,通过查阅计算机网络课本及网上资源的利用,初步掌握了IP 地址及子网掩码的相关概念。接下来我开始复习C 语言的一些编程语句及编程技巧,根据实验的要求着手编写试验程序。在程序的调试过程中遇到的问题是最多的,比如类型不匹配,某一个变量没有定义等,但在错误提示下,逐一进行改错。然后将运行结果进行截图。最后在课程设计的要求下写实习报告。
在整个实习的过程中,我体会到了编程的严谨性,对我的分析能力有很大的提高,这将对我今后的学习有莫大的帮助!
参考文献:
1、计算机网络(第五版) 谢希仁 电子工业出版社 2008年10月版 2、C 程序设计(第三版)谭浩强 清华大学出版社 2005年7月版 3、《网络编程与开发技术》 殷肖川、刘志宏、姬伟峰、万映辉 西安交通大学出版社 2003年9月版
课程设计成绩评定表