#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
//定义IP地址类
class ipTest
{
char ip[15];
char subnetPlusMask[18];
char subnet[18];
char TempIp[15];
char TempSub[18];
int makk;
bool maskIsValid;
public:
ipTest(char*,char*);
~ipTest(){};
bool NoIlleagalChar(char*);
bool ipIsValid(char*);
bool subnetIsValid(char*);
void belong();
void print();
};
void main(int argc,char*argv[])
{
if(argc!=3)
{
cout<<"please input command:ip_test subnet/mask ip";
return;
}
else
{
if(strlen(argv[1])>18)
{
cout<<"Subnet/mask is too long!";
return;
}
if(strlen(argv[2])>15)
{
cout<<"Ip Address is too long!";
return;
}
ipTest test(argv[1],argv[2]);
test.print();
}
}
//ip地址类构造函数
ipTest::ipTest(char* subnetPlusMask,char *ip)
{
maskIsValid=true;
char temp[2];
//将'/'前的字符复制到subnet中
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';
//初始化mask和maskIsValid
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
maskIsValid=false;
//为subnetPlusMask与ip赋值
strcpy(this->subnetPlusMask,subnetPlusMask)
strcpy(this->ip,ip);
strcpy(this->TempIp,ip);
}
//调用判别函数并输出结果
void ipTest::print()
{
bool subIsV=subnetIsValid(TempSub);
bool ipIsV=ipIsValid(TempIP);
//判断子网是否合法
if(!subIsV)
cout<<"subnet is invalid!"<<end1;
else
cout<<"Valid subnet:"<<subnet<<end1;
//判断掩码是否合法
if(!maskIsValid)
cout<<"Mask is invalid!"<<end1;
else
cout<<"Valid subnet: "<<subnet<<end1;
//判断IP地址是否合法
if(!ipIsV)
cout<<"IP address is invalid!"<<end1;
else
cout<<"Valid ip address: "<<ip<<end1;
//判断IP底子是否属于子网
if(subIsV&&ipIsV&&maskIsValid)
belong();
}
//判断是否含有非数字符
bool ipTest::NoIlleagalChar(char *ch)
{
unsigned int i;
unsigned int 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;
//以“.”标志将ip字符串按节分开
token=strtok(ip,ch);
while(token!=NULL)
{
dot[iplen]=token;
iplen++;
token=strtok(NULL,ch);
}
//判断IP地址的段数
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)
{
//调用判别IP地址合法性函数
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++)
{
//temp数组中放“.”间的串
if(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;
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;
//获得掩码
iMask=0xffffffff;
iMask<<=(32-mask);
//子网号与掩码不匹配
if((iSubA|iMask)!=iMask)
{
cout<<"Subnet and mask not match!";
return;
}
//子网号为全1
if((iSubA&iMask)==0)
{
cout<<"Subnet is all 0!";
return;
}
//IP地址与子网号比较
if((iSubA)==(iIPA&iMask))
{
//IP地址全为1
if((iIPA|iMask)==0xffffffff)
{
cout<<"Ip address is all 1!";
return;
}
//IP地址全为0
if((iIPA|iMask)==iMask)
{
cout<<"Ip address is all 0!";
return;
}
//IP地址属于内网
cout<<ip <<" belong to "<<subnetPlusMask<<end1;
return;
}
else
cout<<ip<<" not belong to"<<subnetPlusMask<<end1;
}
丨椎名真白丨