IP地址的合法性和子网判断Word文档下载推荐.docx

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

IP地址的合法性和子网判断Word文档下载推荐.docx

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

IP地址的合法性和子网判断Word文档下载推荐.docx

for(inti=0;

i<

strlen(c);

i++)

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

&

c[i]!

='

.'

{cout<

IP地址中含有非法字符!

return;

if(c[i]=='

dotnum++;

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

if(dotnum!

=3)

IP地址中分隔符只能为3个!

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

for(i=0;

strlen(c)-1;

{if(c[i]=='

&

c[i+1]=='

IP地址中出现连续的分隔符!

}}

//分割IP地址

voidbb(charc[15])

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

for(intm=0;

m<

4;

m++)

{ip[m]=0;

intlen;

len=strlen(c);

if(c[len-1]=='

IP地址最后们不能为分隔符!

chartemp[4][15];

for(intj=0;

j<

15;

j++)

temp[i][j]='

\0'

;

intj=0;

i=0;

for(intk=0;

k<

k++)

{if(c[k]!

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

j++;

else

{i++;

j=0;

}}

{//判断每位的长度

len=strlen(temp[i]);

if(len>

3)

IP地址每位长度不能超过3!

switch(len)

{case3:

{while(len!

=0)

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

len--;

break;

case2:

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

default:

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

}}}

longintnum=0;

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

if(ip[i]>

255)

IP地址数字不能超过255!

}

//分割网络地址

voidee(charc[15])

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

{subnet[m]=0;

子网号最后们不能为分隔符!

子网号每位长度不能超过3!

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

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

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

}

if(subnet[i]>

子网号数字长度不能超过255!

//生成子网掩码

voidcc()

{cout<

子网掩码为:

intr[32];

num;

{r[i]=1;

32-num;

{r[i++]=0;

intp=0;

intw[8];

intk=0;

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

a[n];

if(n!

."

cout<

//判断是否和子网相等

voiddd()

{strings="

{if((a[i]&

ip[i])==subnet[i])

{s=s+"

a"

//如果存在4个a

结果:

if(s=="

aaaa"

属于同一子网!

不属于同一子网!

voidmain()

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

设计成员XXXXXX"

charjj='

y'

while(jj!

n'

请输入IP地址:

cin>

>

Ip_addr;

请输入连续1的个数:

请输入子网号:

sub_net;

IP地址为:

Ip_addr[i];

子网号为:

sub_net[j];

aa(Ip_addr);

bb(Ip_addr);

cc();

ee(sub_net);

dd();

是否继续是(其他键)否(n)"

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。

我做的程序代码如下:

iostream.h>

string.h>

stdlib.h>

voidsplit(char*addr,int*num)

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

chartemp[4][10];

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

for(j=0;

10;

{temp[i][j]='

k=0;

len;

{if(addr[i]!

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

{j++;

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

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

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

地址总长超过了15!

return0;

{if((addr[i]<

'

0'

||addr[i]>

9'

)&

addr[i]!

{

地址中包含非法字符!

if(addr[i]=='

if(dotnum>

地址中分隔符只能为3个!

len-1;

{if(addr[i]=='

addr[i+1]=='

地址中不能出现连续的分隔符!

if(addr[len-1]=='

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

inta[4];

split(addr,a);

{if(a[i]>

255||a[i]<

0)

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

if(a[0]<

1)

地址首位不能为0!

return1;

voidmain(intargc,char*argv[])

{if(argc!

请按以下格式输入命令行:

ip_testsubnet/maskipaddr"

inti,j=0;

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

i++)//分离子网号及子网掩码中1的个数

{if(subnet_mask[i]=='

/'

{flag=true;

subnet[j]='

continue;

if(flag==false)

{subnet[j]=subnet_mask[i];

{mask_num[j]=subnet_mask[i];

mask_num[j]='

IP地址测试:

if(test(ipaddr)==1)

ipaddr<

合法"

不合法"

子网号测试:

if(test(subnet)==1)

subnet<

intmaskn=atoi(mask_num);

掩码中1的个数测试:

if(maskn>

0&

maskn<

=32)

个数为:

mask_num<

合法!

不合法!

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

intnbipaddr[4],nbsubnet[4];

split(ipaddr,nbipaddr);

//分离,未转成二进制,只是分离成十进制

split(subnet,nbsubnet);

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

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

maskn;

{if(cbipaddr[i]!

=cbsubnet[i])

IP地址:

不属于"

这一子网"

属于"

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

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

当前位置:首页 > 表格模板 > 合同协议

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

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