sjf0115 2015-07-05 15:17:00 浏览1943
题目
描述:
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,
如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,
可以进行直接的通讯。就这么简单。
请看以下示例:
运算演示之一:
IP地址:192.168.0.1
子网掩码:255.255.255.0
AND运算
转化为二进制进行运算:
IP地址:11010000.10101000.00000000.00000001
子网掩码:11111111.11111111.11111111.00000000
AND运算:11010000.10101000.00000000.00000000
转化为十进制后为: 192.168.0.0
运算演示之二:
IP地址:192.168.0.254
子网掩码:255.255.255.0
AND运算
转化为二进制进行运算:
IP地址:11010000.10101000.00000000.11111110
子网掩码:11111111.11111111.11111111.00000000
AND运算:11010000.10101000.00000000.00000000
转化为十进制后为:192.168.0.0
通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。
均为192.168.0.0,所以这二台计算机可视为是同一子网络。
接口说明
原型:
int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask);
返回值:
0:IP1与IP2不属于同一子网络。
1:IP1与IP2属于同一子网络。
练习阶段:
初级
代码
/*---------------------------------------
* 日期:2015-07-05
* 作者:SJF0115
* 题目:判断任意两台计算机的IP地址是否属于同一子网络
* 来源:华为机试练习题
-----------------------------------------*/
#include <iostream>
#include "OJ.h"
#include <string>
#include <vector>
using namespace std;
/*
功能: 判断两台计算机IP地址是同一子网络。
原型:
int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask);
输入参数:
char * pcIP1: 计算机1的IP地址,格式:“192.168.0.254”;
char * pcIP2: 计算机2的IP地址,格式:“192.168.0.1”;
char * pcSubNetworkMask: 子网掩码,格式:“255.255.255.0”;
返回值:
0:IP1与IP2不属于同一子网络;
1:IP1与IP2属于同一子网络;
*/
// 检查子网掩码和IP格式是否正确 并返回分段
bool CheckIP(string str,vector<int> &numVec){
int size = str.size();
int pointCount = 0;
string::size_type index = 0;
int prePoint = 0;
vector<string> part;
while((index = str.find_first_of('.',index)) != string::npos){
//..之间有数字
if(index > prePoint){
part.push_back(str.substr(prePoint,index-prePoint));
}//if
++index;
prePoint = index;
++pointCount;
}//while
if(prePoint < size){
part.push_back(str.substr(prePoint));
}//if
int partSize = part.size();
if(partSize != 4){
return false;
}//if
// 判断每一部分均属于0-255
int num;
for(int i = 0;i < partSize;++i){
num = atoi(part[i].c_str());
numVec.push_back(num);
if(num < 0 || num > 255){
return false;
}//if
}//for
// 代表错误IP
if(pointCount != 3){
return false;
}//if
return true;
}
int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask){
if(pcIp1 == NULL || pcIp2 == NULL || pcSubNetworkMask == NULL){
return 0;
}//if
// 转换为string (自己习惯)
string ip1(pcIp1);
string ip2(pcIp2);
string net(pcSubNetworkMask);
vector<int> ip1Vec;
vector<int> ip2Vec;
vector<int> netVec;
int result,result2;
// ip 子网掩码 输入合法
if(CheckIP(ip1,ip1Vec) && CheckIP(ip2,ip2Vec) && CheckIP(net,netVec)){
for(int i = 0;i < 4;++i){
result = ip1Vec[i] & netVec[i];
result2 = ip2Vec[i] & netVec[i];
if(result != result2){
return 0;
}//if
}//for
}//if
else{
return 0;
}//else
return 1;
}