C语言中判断两个IPv4地址是否属于同一个子网的代码
问题描述:
现给定两个IPv4地址,和一个子网掩码,判断是否属于同一个子网,若属于,输出1,否则输出0。
例如输入:
172.16.1.3
172.16.1.35
255.255.255.224
输出:
0
解决方案:
首先将字符串格式的IP地址转化为4字节的IP地址,然后使用与(&)运算,分别将两个IP地址与掩码相与,若最后的值相同,则为同一个子网,否则不是。
以下函数的作用是将字符串格式的IP转化为4字节的IP(因为是4字节,所以使用int,但不同平台的int所占的字节好像不同哈~不太确定)
int_to_int(char*str,intstart_idx,intend_idx) { inta=0,i; for(i=start_idx;i<=end_idx;++i) { a=a*10+(str[i]-'0'); } returna; } /* *将ip字符串转化为4字节的整形 */ intip_to_int(char*ip) { intstart=0,i=0,ret=0; intshift_factor=3;//一开始要向右移动3*8位 charc; while(c=ip[i]) { if(c=='.') { inta=_to_int(ip,start,i-1); inttemp=shift_factor*8; ret=ret|(a<_to_int()函数的作用是将一段字符串转化为数字,实际上就是将点分隔的字符串转化为数字,ip_to_int()函数将字符串格式的ip转化为整形。
以下是ip地址与子网掩码运算的部分:
#includeintmain() { chara1[15],a2[15],a3[15]; gets(a1); gets(a2); gets(a3); intip1=ip_to_int(a1); intip2=ip_to_int(a2); intip3=ip_to_int(a3); intresult=0; if((ip1&ip3)==(ip2&ip3)) { result=1; } printf("%d",result); return0; } 下面是其它网友的补充
题目描述
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
示例:
IP地址192.168.0.1
子网掩码255.255.255.0
转化为二进制进行运算:
IP地址11010000.10101000.00000000.00000001
子网掩码11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
IP地址192.168.0.254
子网掩码255.255.255.0转化为二进制进行运算:
IP地址11010000.10101000.00000000.11111110
子网掩码11111111.11111111.11111111.00000000
AND运算
11000000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。
/*
*功能:判断两台计算机IP地址是同一子网络。
*输入参数:StringMask:子网掩码,格式:“255.255.255.0”;
*Stringip1:计算机1的IP地址,格式:“192.168.0.254”;
*Stringip2:计算机2的IP地址,格式:“192.168.0.1”;
*
*返回值:0:IP1与IP2属于同一子网络;1:IP地址或子网掩码格式非法;2:IP1与IP2不属于同一子网络
*/
publicintcheckNetSegment(Stringmask,Stringip1,Stringip2)
{
/*在这里实现功能*/
return0;
}
输入描述:输入子网掩码、两个ip地址
输出描述:得到计算结果
输入例子:255.255.255.0
192.168.224.256
192.168.10.4
输出例子:1
解答代码:#include#include #include #include #include #include #include usingnamespacestd; typedefstructip { intfirst; intsecond; intthree; }IP; intjudgeIp(stringipSubNet,IP&ip) { intindex=0; ip.first=atoi(&ipSubNet[index]); if(ip.first>255) return0; index++; index=ipSubNet.find_first_of('.',index); ip.second=atoi(&ipSubNet[++index]); if(ip.second>255) return0; index++; index=ipSubNet.find_first_of('.',index); ip.three=atoi(&ipSubNet[++index]); if(ip.three>255) return0; index++; index=ipSubNet.find_first_of('.',index); ip.fouth=atoi(&ipSubNet[++index]); if(ip.fouth>255) return0; return1; } intmain() { stringipSubNet,ipAdd1,ipAdd2; IPsubNet,ip1,ip2; while(cin>>ipSubNet>>ipAdd1>>ipAdd2) { if(judgeIp(ipSubNet,subNet)&&judgeIp(ipAdd1,ip1)&&judgeIp(ipAdd2,ip2)) { ip1.first=ip1.first&subNet.first; ip1.second=ip1.first&subNet.second; ip1.second=ip1.first&subNet.second; ip1.fouth=ip1.first&subNet.fouth; ip2.first=ip2.first&subNet.first; ip2.second=ip2.first&subNet.second; ip2.second=ip2.first&subNet.second; ip2.fouth=ip2.first&subNet.fouth; if(ip1.first==ip2.first&&ip1.second==ip2.second&&ip1.three==ip2.three&&ip1.fouth==ip2.fouth) cout<<'0'< C语言——如何判断两个IP在同一网段
ip_addr.h #defineip_addr_netcmp(addr1,addr2,mask)(((addr1)->addr&\ (mask)->addr)==\ ((addr2)->addr&\ (mask)->addr))在程序中,那个“\”表示它之前的程序和后面的是连接的,下一行和上一行是一个语句,反斜杠符号起到长代码分行书写功能。
注意:C语言中的关键字不可以用“\”分行!
到这里,这篇关于C语言中判断ip是否在同一子网的文章就结束到这。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。