判断任意两台计算机的IP地址是否属于同一子网络

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值