?? ip.txt
字號:
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<ctype.h>
//類結構
class ipTest{
char ip[16]; //定義ip數組,存放ip地址
char subnetPlusMask[19]; //定義subnetPlusMask數組,存放子網號和子網掩碼中1的個數
char subnet[19]; //定義subnet數組,存放子網號
char TempIp[16]; //定義TempIp數組,存放臨時的ip地址
char TempSub[19]; //定義TempSub數組,存放臨時的子網號
int mask; //定義整型mask,存放子網掩碼中1的個數
bool maskIsValid;//定義布爾值maskIsValid,存放判斷mask真值的變量
public:
ipTest(char *,char *); //定義ipTest函數
~ipTest(){};
bool NoIllegalChar(char *); //非法字符的判斷
bool ipIsValid(char *); //判斷IP地址是否合法
bool subnetIsValid(char *); //判斷子網號是否合法
void belong(); //判斷IP是否為子網成員
print();//定義輸出函數print
};
//主函數
void main(int argc,char *argv[]){
if(argc != 3){ //判斷參數格式是否正確
cout<<"error"<<endl<<"format shoud be:ip_test subnet/mask ip"<<endl;//輸出錯誤信息
return;
}
else{
if(strlen(argv[1]) > 18){ //先判斷最簡單的錯誤,子網號及子網掩碼長度和是否超出
cout<<"subnet/mask is too long"; //輸出錯誤信息
return;
}
if(strlen(argv[2]) > 15){ //ip地址長度是否超出
cout<<"ip is too long";//輸出錯誤信息
return;
}
ipTest test(argv[1],argv[2]); //實例化ipTest類
test.print(); //完成相應判別并輸出結果
}
}
//構造函數
ipTest::ipTest(char* subnetPlusMask,char *ip){
maskIsValid = true;
char temp[2];
//把'/'前的字符復制到subnet字符數組中
int smLen = strlen(subnetPlusMask); // 定義smLen為subnetPlusMask的長度
for(int i = 0;i < smLen && subnetPlusMask[i] != '/';i++){
this->subnet[i] = subnetPlusMask[i]; //對subnet數組賦值,值為subnetPlusMask中的數值
this->TempSub[i] = subnetPlusMask[i]; //對TempSub數組賦值,值為subnetPlusMask中的數值
}
subnet[i] = '\0';//給數組加上結束符
TempSub[i] = '\0'; //給數組加上結束符
if(i >= smLen-3&&i<=smLen-2){ //初始化mask和maskIsValid
if(i == smLen-2){
temp[0] = subnetPlusMask[i+1];
if(!isdigit(temp[0])) //判斷temp中的值是否為字符
maskIsValid = false;
}
else if(i == smLen-3){
temp[0] = subnetPlusMask[i+1];
temp[1] = subnetPlusMask[i+2];
if(!(isdigit(temp[0])&&isdigit(temp[1]))) //判斷temp中的值是否為字符
maskIsValid = false;
}
mask = atoi(temp); //將temp中的字符數值化
if(mask<0 || mask >32) //判斷mask值是否超出范圍
maskIsValid = false;
}
else //用十進制數表示的掩碼中1的個數只能是一位數或者兩位數
maskIsValid = false;
strcpy(this->subnetPlusMask,subnetPlusMask); //給subnetPlusMask賦值
strcpy(this->ip,ip); //給IP賦值
strcpy(this->TempIp,ip);
}
//調用判別函數,并輸出結果
ipTest::print(){
bool subIsV = subnetIsValid(TempSub);
bool ipIsV = ipIsValid(TempIp);
if(!subIsV) //subnet非法
cout<<"subnet is invalid!"<<endl;
else
cout<<"valid subnet:"<<subnet<<endl;
if(!maskIsValid) //mask非法
cout<<"mask is invalid!"<<endl;
else
cout<<"valid mask:"<<mask<<endl;
if(!ipIsV) //ip非法
cout<<"ip is invalid!"<<endl;
else
cout<<"valid ip:"<<ip<<endl;
//判斷ip是否belong 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; //若不含有非法數字字符則返回true
}
//判別IP地址是否合法
bool ipTest::ipIsValid(char * ip){
char ch[]="."; //分隔符
char *token,*dot[4];
int iplen = 0;
int dotnum=0;
char addr[18];
int len=strlen(ip);
strcpy(addr,ip);
token = strtok(ip,ch); //以"."標志將IP字符串按節分開
while(token!=NULL){ //循環進行,直到結束
dot[iplen]=token; //將分開的每段賦值給dot
iplen++;
token = strtok(NULL,ch);
}
for(int i=0;i<len;i++) //計算地址中"."的個數
{
if(addr[i]=='.')
{
dotnum++;
}
}
if(dotnum!=3)
{
cout<<"地址中分隔符應為3個!"<<endl;
return false;
}
for(i=0;i<len-1;i++)
{
if(addr[i]=='.' && addr[i+1]=='.')
{
cout<<"地址中不能出現連續的分隔符!"<<endl;
return false;
}
}
if(addr[len-1]=='.')
{
cout<<"地址最后位不能為分隔符!"<<endl;
return false;
}
if(iplen != 4) //段數不對
return false;
for( 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)) //調用判別IP地址合法性的函數
return false;
return true;
}
//判斷IP是否為子網成員,判斷子網號與掩碼是否匹配,以及子網號、主機號全0全1問題
void ipTest::belong(){
int subLen = strlen(subnet); //定義子網號長度
int ipLen = strlen(ip);//定義ip地址長度
unsigned int iIPA,iSubA,iMask; //定義iIPA,iSubA,iMask
unsigned char subA[4],ipA[4]; //定義subA,ipA
char temp[3]; // 定義temp臨時變量
int i,j,t = 0;
for (i = 0, j= 0;i<subLen;i++){ //不用再檢錯
if(subnet[i] !='.')
temp[j++]=subnet[i]; //temp數組中放'.'間的串
else{
subA[3-t] = atoi(temp); //subA數組中放'.'間的數據
j=0;
t++;
temp[0]=temp[1]=temp[2]='\0'; //temp中的數據清除
}
}
subA[0]=atoi(temp); //subA數組中放'.'間的數據中最后一個數據
temp[0]=temp[1]=temp[2]='\0';//temp中的數據清除
iSubA=*(unsigned int *)subA; //iSubA中放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; //iIPA中放IP中'.'除外的串對應的數
iMask = 0xffffffff;
iMask<<=(32-mask);
//獲得掩碼
if((iSubA | iMask)!= iMask){ //說明sub與mask不匹配 位或操作
cout<<"子網號與掩碼不匹配,error!"<<endl;
return;
}
if((iSubA^iMask)==0){ //說明子網號全1 位異或操作
cout<<"子網號全1,error!"<<endl;
return;
}
if((iSubA&iMask)==0){ //說明子網號全0 位與操作
cout<<"子網號全0,error!"<<endl;
return;
}
if((iSubA)==(iIPA&iMask)){ //IP和掩碼與,結果和子網號比較
if((iIPA|iMask)==iMask){ //說明主機號全0
cout<<"主機號全0,error!"<<endl;
return;
}
if((iIPA|iMask)==0xffffffff){ //說明主機號全1
cout<<"主機號全1,error!"<<endl;
return;
}
//ip屬于subnet
cout<<" "<<ip<<" belongs to "<<subnetPlusMask<<endl;
return;
}
//ip不屬于subnet
else
cout<<" "<<ip<<" doesn't belong to "<<subnetPlusMask<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -