IP地址的合法性和子网判断.docx

上传人:b****4 文档编号:3483579 上传时间:2022-11-23 格式:DOCX 页数:15 大小:17.91KB
下载 相关 举报
IP地址的合法性和子网判断.docx_第1页
第1页 / 共15页
IP地址的合法性和子网判断.docx_第2页
第2页 / 共15页
IP地址的合法性和子网判断.docx_第3页
第3页 / 共15页
IP地址的合法性和子网判断.docx_第4页
第4页 / 共15页
IP地址的合法性和子网判断.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

IP地址的合法性和子网判断.docx

《IP地址的合法性和子网判断.docx》由会员分享,可在线阅读,更多相关《IP地址的合法性和子网判断.docx(15页珍藏版)》请在冰豆网上搜索。

IP地址的合法性和子网判断.docx

IP地址的合法性和子网判断

(1)

#include

#include

#include

#include

usingnamespacestd;

inta[4]={0,0,0,0};//分段存放子网

charIp_addr[15];//ip地址

charsub_net[15];//子网

intip[4]={0,0,0,0};

intsubnet[4]={0,0,0,0};//分段存放ip地址

intaddress[4]={0,0,0,0};

intnum;//子网掩码

//判断IP是否合法

voidaa(charc[15])

{//判断IP地址不能超过15

if(strlen(c)>15)

{cout<

"<

return;}

intdotnum=0;

//判断IP地址中是否存在非法字符

for(inti=0;i

{if(isdigit(c[i])==0&&c[i]!

='.')

{cout<

"<

return;}

if(c[i]=='.')

dotnum++;}

//判断IP地址中只能存在3个分隔符

if(dotnum!

=3)

{cout<

"<

return;}

//判断IP地址中是否存在连续分隔符

for(i=0;i

{if(c[i]=='.'&&c[i+1]=='.')

{cout<

"<

return;

}

}}

//分割IP地址

voidbb(charc[15])

{//判断IP地址中最后不能为分隔符

for(intm=0;m<4;m++)

{ip[m]=0;}

intlen;

len=strlen(c);

if(c[len-1]=='.')

{cout<

"<

return;

}

chartemp[4][15];

for(inti=0;i<4;i++)

for(intj=0;j<15;j++)

temp[i][j]='\0';

intj=0;

i=0;

for(intk=0;k

{if(c[k]!

='.')

{temp[i][j]=c[k];

j++;

}

else

{i++;

j=0;

}}

for(i=0;i<4;i++)

{//判断每位的长度

len=strlen(temp[i]);

if(len>3)

{cout<

"<

return;

}

switch(len)

{case3:

{while(len!

=0)

{ip[i]+=(temp[i][len-1]-48)*pow(10,3-len);

len--;}

break;

}

case2:

{while(len!

=0)

{ip[i]+=(temp[i][len-1]-48)*pow(10,2-len);

len--;

}

break;}

default:

{while(len!

=0)

{ip[i]+=(temp[i][len-1]-48)*pow(10,1-len);

len--;

}

}}}

longintnum=0;

for(i=0;i<4;i++)

{//判断每位的大小不超过255

if(ip[i]>255)

{cout<

"<

return;

}}

}

//分割网络地址

voidee(charc[15])

{//判断网络地址中最后不能为分隔符

for(intm=0;m<4;m++)

{subnet[m]=0;}

intlen;

len=strlen(c);

if(c[len-1]=='.')

{cout<

"<

return;

}

chartemp[4][15];

for(inti=0;i<4;i++)

for(intj=0;j<15;j++)

temp[i][j]='\0';

intj=0;

i=0;

for(intk=0;k

{if(c[k]!

='.')

{temp[i][j]=c[k];

j++;

}

else

{i++;

j=0;

}

}

for(i=0;i<4;i++)

{//判断每位的长度

len=strlen(temp[i]);

if(len>3)

{cout<

"<

return;

}

switch(len)

{case3:

{while(len!

=0)

{subnet[i]+=(temp[i][len-1]-48)*pow(10,3-len);

len--;

}

break;

}

case2:

{while(len!

=0)

{subnet[i]+=(temp[i][len-1]-48)*pow(10,2-len);

len--;

}

break;

}

default:

{while(len!

=0)

{subnet[i]+=(temp[i][len-1]-48)*pow(10,1-len);

len--;

}

}

}}

longintnum=0;

for(i=0;i<4;i++)

{//判断每位的大小不超过255

if(subnet[i]>255)

{cout<

"<

return;

}

}}

//生成子网掩码

voidcc()

{cout<<"子网掩码为:

";

intr[32];

for(inti=0;i

{r[i]=1;}

for(intj=0;j<32-num;j++)

{r[i++]=0;}

intp=0;

intw[8];

intk=0;

for(intm=0;m<4;m++)

{intsum=0;

for(intn=0;n<8;n++)

{w[p]=r[k];

sum=sum+w[p]*pow(2,7-n);

p++;

k++;

}

p=0;

a[m]=sum;

}

for(intn=0;n<4;n++)

{cout<

if(n!

=3)

{cout<<".";}

}

cout<

}

//判断是否和子网相等

voiddd()

{strings="";

for(inti=0;i<4;i++)

{if((a[i]&ip[i])==subnet[i])

{s=s+"a";}

}

//如果存在4个a

cout<<"结果:

";

if(s=="aaaa")

{cout<<"属于同一子网!

"<

else

{cout<<"不属于同一子网!

"<

}

voidmain()

{cout<<"************IP地址的合法性及子网的判断*************"<

cout<<"设计成员XXXXXX"<

charjj='y';

while(jj!

='n')

{cout<<"请输入IP地址:

";

cin>>Ip_addr;

cout<<"请输入连续1的个数:

";

cin>>num;

cout<<"请输入子网号:

";

cin>>sub_net;

cout<<"IP地址为:

";

for(inti=0;i<15;i++)

{cout<

cout<

cout<<"子网号为:

";

for(intj=0;j<15;j++)

{cout<

cout<

aa(Ip_addr);

bb(Ip_addr);

cc();

ee(sub_net);

dd();

cout<<"是否继续是(其他键)否(n)";

cin>>jj;}

}

(2)

题目要求:

编写程序,判断一个IP地址是否合法,并判断该地址是否属于一个给定的子网。

要求:

1)以命令行格式运行:

ip_testsubnet/maskip_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.1

3)判断掩码的合法性

4)在IP地址合法的前提下,判断ip_addr是否属于子网subnet

5)输出命令行中的IP是否合法,掩码是否合法(可适当给出不合法原因)以及ip_addr是否属于子网subnet。

我做的程序代码如下:

#include

#include

#include

voidsplit(char*addr,int*num)

{//将点分十进制的字符串转换为数值数组

chartemp[4][10];

inti,j,k,len=strlen(addr);

for(i=0;i<4;i++)

for(j=0;j<10;j++)

{temp[i][j]='\0';}

j=0;

k=0;

for(i=0;i

{if(addr[i]!

='.')

{temp[j][k]=addr[i];

k++;}

else

{j++;

k=0;}

}

for(i=0;i<4;i++)

{num[i]=atoi(temp[i]);}

}

inttoBinary(inta)

{//将十进制数转换为二进制数

if(a/2==0)returna%2;

returna%2+toBinary(a/2)*10;

}

char*toString(int*a)

{//将二进制的数值数组转换32个字符长的字符指针

char*temp=newchar[33];

inti;

boolflag=false;

char*eight=newchar(),*seven=newchar(),*six=newchar(),*five=newchar(),*four=newchar(),

*three=newchar(),*two=newchar(),*one=newchar();

for(i=0;i<4;i++)

{itoa(a[i]/10000000,eight,10);

itoa(a[i]/1000000%10,seven,10);

itoa(a[i]/100000%10,six,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

{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);

}

returntemp;

}

inttest(char*addr)

{//测试IP等点分十进制数的合法性,返回0则不合法,返回1则合法

intlen=strlen(addr);

if(len>15)

{cout<<"地址总长超过了15!

"<

return0;}

intdotnum=0;

for(inti=0;i

{if((addr[i]<'0'||addr[i]>'9')&&addr[i]!

='.')

{

cout<<"地址中包含非法字符!

"<

return0;}

if(addr[i]=='.')

dotnum++;}

if(dotnum>3)

{cout<<"地址中分隔符只能为3个!

"<

return0;}

for(i=0;i

{if(addr[i]=='.'&&addr[i+1]=='.')

{cout<<"地址中不能出现连续的分隔符!

"<

return0;

}

}

if(addr[len-1]=='.')

{

cout<<"地址最后位不能为分隔符!

"<

return0;

}

inta[4];

split(addr,a);

for(i=0;i<4;i++)

{if(a[i]>255||a[i]<0)

{

cout<<"地址数字不在范围0-255之间!

"<

return0;

}

}

if(a[0]<1)

{cout<<"地址首位不能为0!

"<

return0;}

return1;

}

voidmain(intargc,char*argv[])

{if(argc!

=3)

{cout<<"请按以下格式输入命令行:

ip_testsubnet/maskipaddr"<

return;

}

inti,j=0;

boolflag=false;

char*ipaddr=newchar[strlen(argv[2])];

strcpy(ipaddr,argv[2]);//字符串格式的IP地址

char*subnet_mask=newchar[strlen(argv[1])];

strcpy(subnet_mask,argv[1]);

char*subnet=newchar[16];

char*mask_num=newchar[4];

intlen=strlen(subnet_mask);

for(i=0;i

{if(subnet_mask[i]=='/')

{flag=true;

subnet[j]='\0';

j=0;

continue;

}

if(flag==false)

{subnet[j]=subnet_mask[i];

j++;

}

else

{mask_num[j]=subnet_mask[i];

j++;

}

}

mask_num[j]='\0';

cout<<"IP地址测试:

";

if(test(ipaddr)==1)

{cout<

else

{cout<

return;}

cout<<"子网号测试:

";

if(test(subnet)==1)

{cout<

else

{cout<

return;

}

intmaskn=atoi(mask_num);

cout<<"掩码中1的个数测试:

";

if(maskn>0&&maskn<=32)

{cout<<"个数为:

"<

"<

else

{cout<<"个数为:

"<

"<

//将IP地址与子网号转成数值放在数组中

intnbipaddr[4],nbsubnet[4];

split(ipaddr,nbipaddr);//分离,未转成二进制,只是分离成十进制

split(subnet,nbsubnet);

for(i=0;i<4;i++)

{nbipaddr[i]=toBinary(nbipaddr[i]);//将分离出来的十进制转换为二进制

nbsubnet[i]=toBinary(nbsubnet[i]);

}

char*cbipaddr=newchar[33];

char*cbsubnet=newchar[33];

cbipaddr=toString(nbipaddr);//将二进制数组转换为32位的二进制字符指针

cbsubnet=toString(nbsubnet);

//测试是否在子网内,是否需转成二进制比较,可用递归转成二进制(除二取余)

for(i=0;i

{if(cbipaddr[i]!

=cbsubnet[i])

{cout<<"IP地址:

"<

return;

}

}

cout<<"IP地址:

"<

}

对于判断是否属于给定的子网,我采用的方式是将IP地址与子网地址的点分十进制方式都转化为不带分隔符的二进制数,都是32位长,对于给予的子网中1的个数,我只判断其范围,对于其他原因,并示考虑到,希望你看到后,能给予提示,谢谢!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1