判断两个IP是否属于同一子网

子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。

子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。

输入:   String Mask: 子网掩码,格式:“255.255.255.0”; 
*               String ip1: 计算机1的IP地址,格式:“192.168.0.254”;
*               String ip2: 计算机2的IP地址,格式:“192.168.0.1”;

输出:   0:IP1与IP2属于同一子网络;     1:IP地址或子网掩码格式非法;    2:IP1与IP2不属于同一子网络


#include <iostream>
#include <string>
using namespace std;
void checkNetSegment(string mask,string ip1,string ip2)
{	
	int count1=0, count2=0, count3=0;
	int count4=0, count5=0, count6=0;
	int i=0;
	for (i=0;i<mask.size();i++)
	{
		if (mask[i]=='.'&&mask[i+1]!='.')
		{
			count1++;
		}
	}
	for (i=0;i<ip1.size();i++)
	{
		if (ip1[i]=='.'&&ip1[i+1]!='.')
		{
			count2++;
		}
	}
	for (i=0;i<ip2.size();i++)
	{
		if (ip2[i]=='.'&&ip2[i+1]!='.')
		{
			count3++;
		}
	}
	for (i=0;i<mask.size();i++)
	{
		if (mask[i]=='.')
		{
			count4++;
		}
	}
	for (i=0;i<ip1.size();i++)
	{
		if (ip1[i]=='.')
		{
			count5++;
		}
	}
	for (i=0;i<ip2.size();i++)
	{
		if (ip2[i]=='.')
		{
			count6++;
		}
	}

	if ((count1==count2&&count2==count3&&count3==3) &&(count4==count5&&count5==count6&&count6==3 ))
	{
		string maskStr[4],IP1Str[4],IP2Str[4];
		int flag1=0;
		int k=0;
		i=0;
		int len = mask.size();
		while(i<len)
		{
			int tmp =i;
			while(tmp<len&&isdigit(mask[tmp]))
				tmp++;
			if (tmp <= mask.size())
			{
				if ((tmp<len&&mask[tmp]=='.')||(tmp==len))
				{
					maskStr[k++] = mask.substr(i,tmp-i);
					i = tmp+1;
				}else{
					cout<<"1"<<endl;
					return;
				}
			}
		}
		int flag2=0;
		k=0;
		i=0;
		len = ip1.size();
		while(i<len)
		{
			int tmp =i;
			while(tmp<len&&isdigit(ip1[tmp]))
				tmp++;
			if((tmp<len&&ip1[tmp]=='.')||(tmp==len))
			{
				IP1Str[k++] = ip1.substr(i,tmp-i);
				i = tmp+1;
			}else{
				cout<<"1"<<endl;
				return;
			}
		}
		int flag3=0;
		k=0;
		i=0;
		len = ip2.size();
		while(i<len)
		{
			int tmp =i;
			while(tmp<len&&isdigit(ip2[tmp]))
				tmp++;
			if ((tmp<len&&ip2[tmp]=='.')||(tmp==len))
			{
				IP2Str[k++] = ip2.substr(i,tmp-i);
				i = tmp+1;
			}else{
				cout<<"1"<<endl;
				return;
			}
		}
		for (i=0;i<4;i++)
		{
			if (atoi(maskStr[i].c_str())>=0&&atoi(maskStr[i].c_str())<256)
			{
				flag1++;
			}
		}
		for (i=0;i<4;i++)
		{
			if (atoi(IP1Str[i].c_str())>=0&&atoi(IP1Str[i].c_str())<256)
			{
				flag2++;
			}
		}
		for (i=0;i<4;i++)
		{
			if (atoi(IP2Str[i].c_str())>=0&&atoi(IP2Str[i].c_str())<256)
			{
				flag3++;
			}
		}

		if (flag1==flag2&&flag2==flag3&&flag3==4)
		{
			for (i=0;i<4;i++)
			{
				if ((atoi(IP1Str[i].c_str())&atoi(maskStr[i].c_str()))!= (atoi(maskStr[i].c_str())&atoi(IP2Str[i].c_str())))
				{
					cout<<"2"<<endl;
					return;
				}
			}
			cout<<"0"<<endl;
		}else{
			cout<<"1"<<endl;
		}
	}else{
		cout<<"1"<<endl;
	}
}  
int main() 
{ 	
	string s1,s2,s3; 
	while(1)
	{
		cin>>s1>>s2>>s3; 
		checkNetSegment(s1,s2,s3); 
	}

	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值