⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ip_test.cpp

📁 IP地址访问
💻 CPP
字号:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <ctype.h>
 

//类结构
class   ipTest{
	char ip[15];
	
	char subnetplusMask[18];
	char subnet[18];
	char TempIp[15];
	char TempSub[18];
	int mask;
	bool maskIsValid;

   public:
	ipTest(char *,char *);
	~ipTest(){};
	bool NoIllegalChar(char *);//非法字符判断
	bool ipIsValid(char*);     //判断IP地址是否合法
	bool subnetIsValid(char*);//判断子网号是否合法
	void belong();
	print();	
		};


//主函数

 void   main(int argc,char* argv[]){
	if(argc!=3){
		cout<<"error"<<endl<<"format shoud be:ip_teat subnet/mask ip"<<endl;
		return;
		   }
	   else{
		if(strlen(argv[1])>18){
                   cout<<"subnet/mask is too long";
			return;
                                      }
		if(strlen(argv[2])>15){
		       			cout<<"ip is toolong";
		   			return;
                                     }
	ipTest  test( argv[1],argv[2]);//实例化ipTest类
	test.print();//完成相应判别并输入结果
                }	
}

//构造函数
ipTest::ipTest( char* subnetPlusMask, char *ip){
	maskIsValid=true;
	char temp[2];


	int smLen=strlen(subnetPlusMask);
	for(int i=0;i<smLen&&subnetPlusMask[i]!='/';i++){
		this->subnet[i]=subnetPlusMask[i];
		this->TempSub[i]=subnetPlusMask[i];
                }
	subnet[i]='\0';
	TempSub[i]='\0';

	if(i<=smLen-2){
		if(i==smLen-2){
			temp[0]=subnetPlusMask[i+1];
			if(!isdigit(temp[0]))
				maskIsValid=false;
			}

	else if(i==smLen-3){
		temp[0]=subnetPlusMask[i+1];
		temp[1]=subnetPlusMask[i+2];
		if(!(isdigit(temp[0])&&isdigit(temp[1])))
			maskIsValid=false;
               }
	mask=atoi(temp);
	if(mask<0||mask>32)
	maskIsValid=false;
        }
     
 	else //用十进制数表示的掩码中1的个数只能是一位数或者两位数
		maskIsValid=false;

	strcpy(this->subnetplusMask,subnetPlusMask);//给subnetPlusMask赋值
	strcpy(this->ip ,ip);
	strcpy(this->TempIp,ip);
}




//调试判别函数,并输入结果
ipTest::print(){
	bool subIsV=subnetIsValid(TempSub);
	bool ipISv=ipIsValid(TempIp);

	if(!subIsV)
    		cout<<"SUBNET IS INVALID !"<<endl;
	else
		cout<<"valid subnet"<<subnet<<endl;
	if(!maskIsValid)
		cout<<"mask is invald!"<<endl;
	else
		cout<<"valid mask"<<mask<<endl;
	if(!ipISv)
		cout<<"ip is invald!"<<endl;
	else
		cout<<"valid ip"<<ip<<endl;


	//判断IP是否属于SUBNET
	if(subIsV&&ipISv&&maskIsValid)
	   belong();
}





//子函数,判断输入是否含有非法字符
 
bool ipTest::NoIllegalChar(char *ch){
	unsigned int i,k=0;
	for(i=0;i<strlen(ch);i++){
		if(isdigit(*(ch+i))==0){
  			return false;
	   }
        }
       return true;
}




//判别IP是否合法
bool ipTest::ipIsValid(char *ip){
	char ch[]=".";
	char *token,*dot[4];
	int iplen=0;

	token =strtok(ip,ch);
		while(token!=NULL){
	dot[iplen]=token;
	iplen++;
	token=strtok(NULL,ch);
		}
	
	if(iplen!=4)
	   return false;
	for(int i=0;i<4;i++)
	{
		if(!NoIllegalChar(dot[i])||atoi(dot[i])>255)
           return false;
	}
	return true ;
}



//判断子网号是否合法
bool ipTest::subnetIsValid(char *subnet){
	if(!ipIsValid(subnet))
		return false;
	return true;
}



//判断IP是否为子网哪成员,是否子网号与掩码匹配

void ipTest::belong(){
	int subLen=strlen(subnet);
	int iplen=strlen(ip);


	unsigned int iIPA,iSubA,iMask;
	unsigned char subA[4],ipA[4];
	char temp[3];
	int i,j,t =0;



	for(i=0,j=0;i<subLen;i++)
	{
	 if(subnet[j++]==subnet[i])

	 temp[j++]=subnet[i];
	 else{

		subA[3-t]=atoi(temp);
		j=0;
		t++;
		temp[0]=temp[1]=temp[2]='\0';
		} 
	}
	subA[0]=atoi(temp);
	temp[0]=temp[1]=temp[2]='\0';
	iSubA=*(unsigned int *)subA;//isunA中放SUBNET中'.'除外的串


	for(i=0,j=0,t=0;i<iplen;i++){
		if(ip[i]!='.')
			temp[j++]=ip[i];
		else{
			ipA[3-t]=atoi(temp);
			j=0;
			t++;
			temp[0]=temp[1]=temp[2]='\0';
		}
        }

	ipA[0]=atoi(temp);
	iIPA=*(unsigned int *)ipA;//ipA中放ip中'.'除外的串
	

	iMask=0xffffffff;
	iMask<<=(32-mask);//获得掩码
	

	if((iSubA|iMask)!=iMask){
		cout<<"子网掩码不匹配,ERROR!"<<endl;
		return;
        }
	if((iSubA^iMask)==0){
		cout<<"子网全为1,error!"<<endl;
		return;
	}
	if((iSubA&iMask)==0){
		cout<<"子网全为0,error!"<<endl;
		return;
	}

	if((iSubA)==(iIPA&iMask)){
		if((iIPA|iMask)==iMask){
			cout<<"主机号全为0,error!"<<endl;
			return;
		}
		if((iIPA|iMask)==0xffffffff){
			cout<<"主机号全为1,error!"<<endl;
			return;
		}	
		//ip 属于subnet
			cout<<"  "<<ip<<"belong to "<<subnetplusMask<<endl;
		return;
	}
	//ip 不属于subnet
	else
			cout<<"  "<<ip<<"doesn't belong to "<<subnetplusMask<<endl;
		return;

}





















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -