IP地址的合法性及子网判断计算机网络系统设计书.docx_第1页
IP地址的合法性及子网判断计算机网络系统设计书.docx_第2页
IP地址的合法性及子网判断计算机网络系统设计书.docx_第3页
IP地址的合法性及子网判断计算机网络系统设计书.docx_第4页
IP地址的合法性及子网判断计算机网络系统设计书.docx_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IP地址的合法性及子网判断计算机网络系统设计书第一章 概述1.1课程设计目的本设计要求编写程序,判断一个IP地址是否合法,并判断该地址是否是属于一个给定的子网。从而考察读者是否对IP地址概念及子网划分有非常清楚的认识。1.2 课程设计的要求在掌握IP 地址的表示方法及指望划分方法的基础上,按如下要求完成程序。1) 命令行格式:ip_test subnet/mask ip_addr其中,ip_test为程序名;subnet为子网好;mask是一个数值,代表子网掩码连续1 的个数;ip_addr是要测试的IP地址。例如,要测试的IP地址为0,子网号为,子网掩码为,则没命令行为ip_test/24 0.(因为是连续的24个1,所以用24表示。)2) 判断subnet和ip_addr的合法性。在判断IP地址的合法性是要自行编写代码,不要用任何的inet函数。判断是要考虑全面,比如以下IP 的地址的合法性:123.2.1123.23¥.2.1.13) 判断掩码的合法性。4) 在IP地址合法的前提下,判断ip_addr是否属于子网subnet。5) 输入命令行中的ip是否合法,掩码是否合法(可适当给出不合法原因)以及ip_addr是否属于子网subnet。第二章 具体设计2.1设计思路根据以上的要求,并结合当前的所学的一些知识和技术,我们最终通过另一种方式来实现相同的功能,但代码更加优化,高效,方便用户的窗体程序。对于以上的要求,设计思路如下:1. 程序大致流程1) 分别判断子网号,掩码和ip地址的基本格式的合法性。2) 如果三者的基本格式都合法,才调用判定“IP地址是否为子网成员”的函数。该函数同时判别子网号和掩码是否匹配,子网号为全0或全1,主机号为全0、全1。2. 核心代码及说明判断ip地址是否合法,才调用判定“IP地址是否为子网成员”的函数。该函数同时判断子网号与掩码是否匹配,子网号为全0或全1,主机号为全0、全1.3. 核心代码及说明1) 判断IP地址是否合法。 一般来说,我们先检查最明显的错误。例如,可以先判断IP中“.”的个数是否正确;接着,以“.”为标志将IP字符串按节分开;然后,看该IP是否为4段,再判断各节是否是0255间的整数。关于网络号、主机号全0全1等问题要在后面结合子网掩码一起判断。这里德关键是怎么样将IP字符串以“.”为标志按节分开,这要用到函数strtok(char * strToken,const char * strDelimit)。第一个参数是给定的串,第二个参数是分隔符集合,该函数的功能就是以strDelimit中包含的任意字符为分隔符,在strToken中寻找下一个token。每一次调用strtok后,都会在strToken中插入一个NULL字符,所以,如果要读取下一个stoken,接下来调用strtok时第一个参数用NULL。这样,IP串的每一段都放到dot数组里了,下面判断是否有非法字符,每一段的值是否在0255之间,就很容易了。2) 判断IP地址是否为子网成员,判断子网号与掩码是否匹配,以及子网号、主机号全0、全1的问题2.2流程图如下:当用户启动程序后(如图2.1),在输入框中输入IP、子网、子网掩码,然后点击测试,验证其合法性。在此过程中调用子程序isLegal(如图2.2)在子程序中判断输入的IP地址是否合法(其中包括:1.判断输入的IP长度是否合法;2.判断输入的IP是否含有非法字符;3.判断输入的IP格式是否正确;4.判断输入的IP是否已转化为Ipaddress的实例)。跳回到主程序中继续执行,如果IP、子网、子网掩码都合法,调用子程序subChecked(如图2.3),在子程序中完成判断子网号和子网掩码是否匹配,如果匹配则进一步判读子网号是否为全0或全1,否则输出子网号和子网掩码不匹配提示。接下来,如果子网号不为全0或全1则将IP和掩码做“与”运算,结果和子网号比较,否则输出子网号为全0或全1提示。再接下来,判断比较结果(IP和掩码做“与”运算的结果和子网号的比较结果)是否相等,如果相等则判断主机号是否为全0或全1,如果不相等则输出“IP不属于该子网”。最后,如果主机号为全0或全1则输出主机号为全0或全1提示,如果主机号不为全0或全1则输出“IP属于该子网”。子程序执行完后返回主程序中继续执行,然后完成ip地址是否属于给定子网的判定输入IP,子网,掩码点击检测按钮计算子网号属于?输出结果提示出错计算ip类型验证合法性NY结束开始图2.1-主流程图图2.2-子程序islegal流程图图2.3-子流程图subChecked2.3核心源代码分析与说明using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net.Sockets;using System.Net;using System.Text.RegularExpressions;namespace WindowsFormsApplication1 public partial class Form1 : Form public Form1() InitializeComponent(); string ipAddress;/声明ip地址 string childIp; /声明子网号 string yanma;/声明子网掩码/*以下代码为单击检测按钮后执行相关的操作,程序首先清空 * 显示框listbox中的数据,然后检测由用户输入的ip地址 * 子网号,以及子网掩码的合法性,通过调用函数islegal来初步检测, * 合法返回true,不合法返回false,并输出错误 * 信息,若验证通过,计算ip地址的二进制形式并输出,然后通过 * 给出的数据将ip地址与子网掩码进行与运算,并将结 * 果与给出的子网号进行比较,判断并输出该ip地址是否属于 * 给定的子网号 */ private void button1_Click(object sender, EventArgs e) /清空listBox中的内容 this.listBox1.Items.Clear(); /获取用户输入的ip地址 ipAddress = txtIp.Text; /获取子网号 childIp = txtChild.Text; /获取子网掩码 yanma = txtYanma.Text; /判断输入的ip地址,子网号,子网掩码是否合法 if (!islegal(ipAddress) MessageBox.Show(ip地址输入错误!, 提示); return; else if (!islegal(childIp) MessageBox.Show(子网号输入错误!, 提示); return; else if (!islegal(yanma) MessageBox.Show(子网掩码错误!, 提示); return; else LbAdd(本次计算结果如下:); string stp = ChangeIP(ipAddress); GetIpStyle(stp); LbAdd(ipAddress + 转化为二进制形式为:); LbAdd(stp); /string sto = ChangeIP(yanma); /LbAdd(yanma + 转化为二进制形式为: +sto); / LbAdd(与子网掩码进行与运算); /MessageBox.Show(stp); Byte ip3=IPAddress.Parse(ipAddress).GetAddressBytes(); /foreach (byte b in ip3) / / LbAdd(b.ToString(); / /double ip2 =Convert.ToDouble(ChangeIP(ipAddress); /double cip2 = Convert.ToDouble(ChangeIP(childIp); /double ym2 = Convert.ToDouble(ChangeIP(yanma); /MessageBox.Show(ip2.ToString(); uint ip = GetBinaryIp(ipAddress); uint cip = GetBinaryIp(childIp); f uint ym = GetBinaryIp(yanma); /*以下代码为子程序SubChecked中的内容,此处为方便编写, * 直接写在了主程序体中,基本思路是按流程图走的,首先判断 * 子网号与掩码是否匹配,接着检测子网号是否为全0或全1的情况, * 接着检测主机号为全0或全1的情况,最后判断计算出的子网号是 * 否与给定的子网号相同,并输出结果信息 */ /说明子网号与掩码不匹配 if(cip|ym)!=ym) LbAdd(子网号与掩码不匹配,error!); Console.WriteLine(0, (ip | ym); Console.WriteLine(0, ym); return; /说明子网号全1 if(cipym)=0) LbAdd(子网号全1,error!); return; /说明子网号全0 if(cip&ym)=0) LbAdd(子网号全为0,error!); return; /ip和掩码做与运算,结果和子网号比较 if (cip=(ip&ym) /MessageBox.Show(success); /说明主机号全0 if (ip | ym) = ym) LbAdd(主机号为全0,error!); return; /说明主机号全1 if (ip | ym) = 0xffffffff) LbAdd(主机号全1,error!); return; LbAdd(该ip 属于子网 +childIp); return; else /MessageBox.Show(faile); LbAdd(该ip不属于子网 + childIp); /Convert.ToString(11, 2); / / 判断输入的IP地址类型是否合法,合法返回TRUE,不合法返回FALSE / / 传入待验证IP / private bool islegal(string strIp) IPAddress myip; int length = ChangeIP(strIp).Length; /用正则表达式判断输入的ip类型是否合法 Regex regIp=new Regex(d0,3.d0,3.d0,3.d0,3); if(!regIp.IsMatch(strIp) return false; /判断输入的ip型字符串能否转化为ip型 else if (!IPAddress.TryParse(strIp, out myip) return false; /判断ip长度是否合法 else if(length!=32) return false; / else if (GetBinaryIp(strIp)) else return true; / / 将十进制ip 转化为二进制 / / / public string ChangeIP(string strIP) string strHtml = ; try string IParray = strIP.Split(.); /拆分IP int IP1 = Convert.ToInt32(IParray0); int IP2 = Convert.ToInt32(IParray1); int IP3 = Convert.ToInt32(IParray2); int IP4 = Convert.ToInt32(IParray3); string strIP1 = GetIP(IP1); string strIP2 = GetIP(IP2); string strIP3 = GetIP(IP3); string strIP4 = GetIP(IP4); /将拆分后的ip地址重新组合起来 strHtml = strIP1 + strIP2 + strIP3 + strIP4; catch MessageBox.Show(输入地址类型有错!,可能包含其他字符。,警告); return strHtml; / / 得到二进制IP / / / public string GetIP(int IP) string strIP = Convert.ToString(IP, 2); int len = strIP.Length; if (len 8) for (int i = 0; i 8 - len;i+) strIP = 0 + strIP; return strIP; / / 直接转化为二进制形式的ip地址,返回无符号整数形式 / / / private uint GetBinaryIp(string str) IPAddress myip = IPAddress.Parse(str); uint iptest = BitConverter.ToUInt32(myip.GetAddressBytes(), 0); return iptest; / / 向listbox中添加测试的结果 / / private void LbAdd(string str) listBox1.Items.Add(str); / / 获取ip地址的类型 / / private void GetIpStyle(string str) if (str.StartsWith(0) LbAdd(该ip属于A类网络); else if (str.StartsWith(10) LbAdd(该ip属于B类网络); else if (str.StartsWith(110) LbAdd(该ip属于C类网络); else if (str.StartsWith(1110) LbAdd(该ip属于D类网络); else if (str.StartsWith(11110) LbAdd(该ip属于E类网络); else LbAdd(ip地址计算错误!); private void listBox1_SelectedIndexChanged(object sender, EventArgs e) /*以下代码为清空按钮中的内容,作用是将各 * 个输入框中的内容清空 */ private void button2_Click(object sender, EventArgs e) this.txtChild.Text = ; this.txtIp.Text = ; this.txtYanma.Text = ; 第三章 结果分析与总结3.1结果与分析 程序截图:运行时截图:分析:Ip地址0转化为二进制为11001010011100010001000000001010子网掩码转化为二进制位11111111111111111111111100000000他们相与之后为11001010011100010001000000000000化为点分十进制为 程序计算的结果符合结果,正确。 分析: 当ip地址用点分十进制表示时,如1 。由于输入的ip地址为168.113.2022.0,不符合要求所以,程序提示出错。分析:当ip地址用点分十进制表示时,应该为4字节,每个字节表示的范围在0-255之间,而且每个字节之间用点号分隔。由于输入的ip地址为168.113.20没有4字节,所以程序提示出错。分析:Ip地址只能由数字组成,而输入的ip地址中出现了非数字的字符f,所以程序提示出错。3.2总结1.遇到的问题本次我们采用c#语言作为工具,来书写我们的代码,设计了一个windows下的窗体应用程序。在此次设计中对关于ip的合法性的检测和对ip的地址与掩码相与运算上出现了些许问题。在ip地址的合法性判断上我们采用正则表达式匹配字符的方法,这是种简洁快速的判定方法。再次就是如何把用户输入的ip地址(字符串类型)转化为二进制的32

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论