编程判断IP地址的合法性

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月版

课程设计成绩评定表


相关内容

  • 自动化立体仓库控制系统设计
  • 摘要:自动化立体仓库可以自动地完成物料的仓储和取出,主要由堆垛机.FX2N-20GM.PLC.触摸屏.伺服驱动等几部分组成,该控制系统的核心部分为FX2N-20GM.PLC及伺服驱动部分的连接.参数设置及编程. 关键词:立体仓库PLCFX2N-20GM伺服驱动系统 0 引言 自动化立体仓库是指在人工 ...

  • 网络爬虫技术探究
  • JIU JIANG UNIVERSITY 毕 业 论 文 题 目 网络爬虫技术探究 英文题目 院 系 信息科学与技术学院 专 业 计算机科学与技术 姓 名 闻泽 班级学号 A081129 指导教师 二○一二年五月 信息科学与技术学院学士学位论文 摘 要 网络爬虫是一种自动搜集互联网信息的程序.通过网 ...

  • 服装销售系oc
  • 服装销售系统 xxx服装销售系统是一个基于Web,以ASP脚本语言为运行环境的软件开发程序,并采用Microsoft Office Access2003作为数据库,对数据进行保存.修改.删除等管理.为用户提供了一个友好.简单快捷的运行操作平台.本系统的主要功能是在用户通过会员注册后登录本系统,对本系 ...

  • 基于51单片机的数据采集器
  • 重庆大学本科专业综合课程设计论文 电类课程设计 题 目: 数据采集的控制系统设计 学 生: xxx xxx xxx 指导教师: x x 院 系: xx 工程学院 专业班级: xxxxx3班 x x 大 学 2014 年 6 月 摘要 数据的采集和处理是数字信号处理中十分重要的一个环节,为了设计一个对 ...

  • 用C语言模拟内存分区分配管理的最佳适应算法
  • [摘要]本文用C语言程序设计中链表的思想,模拟了操作系统课程存储管理的最佳适应算法,其运行结果形象地展示了动态内存分配与回收的过程.这不仅能激发学生学习枯燥的操作系统,还有助于学生更好地掌握C语言知识的综合应用,提高学生的编程能力. 中国论文网 http://www.xzbu.com/8/view- ...

  • 单片机原理及应用期末考试题试卷及答案大全
  • 单片机模拟试卷001 一.选择题(每题1分,共10分) 1.8031单片机的( )口的引脚,还具有外中断.串行通信等第二功能. a)P0 b)P1 c)P2 d)P3 2.单片机应用程序一般存放在( ) a) RAM b)ROM c)寄存器 d)CPU 3.已知某数的BCD码为0111 0101 0 ...

  • 基于单片机的交通信号灯控制电路设计
  • 毕业设计说明书(论文) 课题名称: 交通信号灯控制电路设计(单片机) 航空电子设备维修 专业 081331班 学生姓名 黄波 学号 27 指导老师 贺国灿 技术职称______________ 2011年 03 月 16 日 毕业设计(论文)任务书 学生姓名:黄波 班级:081331 1. 毕业设计 ...

  • 计算机网络安全问题浅析论文
  • 毕业论文 论文题目: 计算机网络安全问题浅析 专 业: 计算机信息管理 作 者: 韩子厚 学 校: 天津城市建设管理职业技术学院 指导教师: 2011年 月 日 目录 内容摘要 ............................................................. ...

  • 基于单片机定时闹钟的设计
  • 本科毕业课程(设计) (设计目)题:单片机定时闹钟设计 学 院: 明德学院 专 业: 电子信息工程 班 级: 电信12151 学 号: [1**********]1 学生姓名: 袁杰 指导教师: 王许 2015年 6月23号 贵州大学本科毕业课程(设计) 诚信责任书 本人郑重声明:本人所呈交的课程设 ...