📄 ip_test.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 + -