IP地址的合法性和子网判断.doc_第1页
IP地址的合法性和子网判断.doc_第2页
IP地址的合法性和子网判断.doc_第3页
IP地址的合法性和子网判断.doc_第4页
IP地址的合法性和子网判断.doc_第5页
免费预览已结束,剩余5页可下载查看

下载本文档

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

文档简介

(1)#include#include#include#includeusing namespace std;int a4=0,0,0,0; /分段存放子网char Ip_addr15; /ip地址char sub_net15; /子网int ip4=0,0,0,0;int subnet4=0,0,0,0; /分段存放ip地址int address4=0,0,0,0;int num; /子网掩码/判断IP是否合法void aa(char c15) /判断IP地址不能超过15 if(strlen(c)15) coutendlIP地址总长度不能超过15!endl; return; int dotnum=0; /判断IP地址中是否存在非法字符 for(int i=0;istrlen(c);i+) if(isdigit(ci)=0 & ci!=.) coutendlIP地址中含有非法字符!endl; return ; if(ci=.) dotnum+; /判断IP地址中只能存在3个分隔符 if(dotnum!=3) coutendlIP地址中分隔符只能为3个!endl; return; /判断IP地址中是否存在连续分隔符 for(i=0;istrlen(c)-1;i+) if(ci=. & ci+1=.) coutendlIP地址中出现连续的分隔符!endl; return; /分割IP地址void bb(char c15) /判断IP地址中最后不能为分隔符 for(int m=0;m4;m+) ipm=0; int len; len=strlen(c); if(clen-1=.) coutendlIP地址最后们不能为分隔符!endl; return; char temp415; for(int i=0;i4;i+) for(int j=0;j15;j+) tempij=0; int j=0; i=0; for(int k=0;kstrlen(c);k+) if(ck!=.) tempij=ck; j+; else i+; j=0; for(i=0;i3) coutendlIP地址每位长度不能超过3!endl; return; switch(len) case 3: while(len!=0) ipi+=(tempilen-1-48)*pow(10,3-len); len-; break; case 2: while(len!=0) ipi+=(tempilen-1-48)*pow(10,2-len); len-; break; default: while(len!=0) ipi+=(tempilen-1-48)*pow(10,1-len); len-; long int num=0; for(i=0;i255) coutendlIP地址数字不能超过255!endl; return; /分割网络地址void ee(char c15) /判断网络地址中最后不能为分隔符 for(int m=0;m4;m+) subnetm=0; int len; len=strlen(c); if(clen-1=.) coutendl子网号最后们不能为分隔符!endl; return; char temp415; for(int i=0;i4;i+) for(int j=0;j15;j+) tempij=0; int j=0; i=0; for(int k=0;kstrlen(c);k+) if(ck!=.) tempij=ck; j+; else i+; j=0; for(i=0;i3) coutendl子网号每位长度不能超过3!endl; return; switch(len) case 3: while(len!=0) subneti+=(tempilen-1-48)*pow(10,3-len); len-; break; case 2: while(len!=0) subneti+=(tempilen-1-48)*pow(10,2-len); len-; break; default: while(len!=0) subneti+=(tempilen-1-48)*pow(10,1-len); len-; long int num=0; for(i=0;i255) coutendl子网号数字长度不能超过255!endl; return; /生成子网掩码void cc() cout子网掩码为:; int r32; for(int i=0;inum;i+) ri=1; for(int j=0;j32-num;j+) ri+=0; int p=0; int w8; int k=0; for(int m=0;m4;m+) int sum=0; for (int n=0;n8;n+) wp=rk; sum=sum+wp*pow(2,7-n); p+; k+; p=0; am=sum; for(int n=0;n4;n+) coutan; if(n!=3) cout.; coutendl;/判断是否和子网相等void dd() string s=; for(int i=0;i4;i+) if(ai&ipi)=subneti) s=s+a; /如果存在4个a cout结果:; if(s=aaaa) cout属于同一子网!endl; else cout不属于同一子网!endl; void main() cout *IP地址的合法性及子网的判断*endl; cout 设计成员XXX XX Xendl; char jj=y; while(jj!=n) coutIp_addr; coutnum; coutsub_net; coutIP地址为:; for(int i=0;i15;i+) coutIp_addri; coutendl; cout子网号为:; for(int j=0;j15;j+) coutsub_netj; coutendl; aa(Ip_addr); bb(Ip_addr); cc(); ee(sub_net); dd(); coutjj; (2)题目要求:编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网。要求:1)以命令行格式运行: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 2)判断subnet和ip_addr的合法性(注意考虑全面,比如以下IP均为不合法 123.2.1 123.23$.2.1 123.12345.2.1 123.23.45.2.13)判断掩码的合法性4) 在IP地址合法的前提下,判断ip_addr是否属于子网subnet5)输出命令行中的IP是否合法,掩码是否合法(可适当给出不合法原因)以及ip_addr是否属于子网subnet。我做的程序代码如下:#include#include#includevoid split(char *addr,int *num)/将点分十进制的字符串转换为数值数组 char temp410; int i,j,k,len=strlen(addr); for(i=0;i4;i+) for(j=0;j10;j+) tempij=0; j=0; k=0; for(i=0;ilen;i+) if(addri!=.) tempjk=addri; k+; else j+; k=0; for(i=0;i4;i+) numi=atoi(tempi); int toBinary(int a)/将十进制数转换为二进制数 if(a/2=0) return a%2; return a%2+toBinary(a/2)*10;char * toString(int *a)/将二进制的数值数组转换32个字符长的字符指针 char *temp=new char33; 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;i15) cout地址总长超过了15!endl; return 0; int dotnum=0; for(int i=0;ilen;i+) if(addri9) & addri!=.) cout地址中包含非法字符!3) cout地址中分隔符只能为3个!endl; return 0; for(i=0;ilen-1;i+) if(addri=. & addri+1=.) cout地址中不能出现连续的分隔符!endl; return 0; if(addrlen-1=.) cout地址最后位不能为分隔符!endl; return 0; int a4; split(addr,a); for(i=0;i255 | ai0) cout地址数字不在范围0-255之间!endl; return 0; if(a01) cout地址首位不能为0!endl; return 0; return 1;void main(int argc,char * argv) if(argc!=3) cout请按以下格式输入命令行:ip_test subnet/mask ipaddrendl; return; int i,j=0; bool flag=false; char *ipaddr=new charstrlen(argv2); strcpy(ipaddr,argv2); /字符串格式的IP地址 char *subnet_mask=new charstrlen(argv1); strcpy(subnet_mask,argv1); char *subnet=new char16; char *mask_num=new char4; int len=strlen(subnet_mask); for(i=0;ilen;i+) /分离子网号及子网掩码中1的个数 if(subnet_maski=/) flag=true; subnetj=0; j=0; continue; if(flag=false) subnetj=subnet_maski; j+; else mask_numj=subnet_maski; j+; mask_numj=0; coutIP地址测试:; if(test(ipaddr)=1) coutipaddr合法endl; else coutipaddr不合法endl; return; cout子网号测试:; if(test(subnet)=1) coutsubnet合法endl; else coutsubnet不合法endl; return; int maskn=atoi(mask_num); cout0 & maskn=32) cout个数为:mask_num,合法!endl; else cout个数为:mask_num,不合法!endl; /将IP地址与子网号转成数值放在数组中 int nbipaddr4,nbsubnet4; split(ipaddr,nbipaddr);/分离,未转成二进制,只是分离成十进制 split(subnet,nbsubnet); for(i=0;i4;i+) nbipaddri=toBinary(nbipaddri);/将分离出来的十进制转换为二进制 nbsubneti=toBinary(nbsubneti); char *cbipaddr=new char33; char *cbsubnet=new char33; cbipaddr=toString(nbipaddr);/将二进制数组转换为32位的二进制字符指针 cbsubnet=toString(nbsubnet);

温馨提示

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

评论

0/150

提交评论