文档章节

判断两个IP是否属于同一子网

一贱书生
 一贱书生
发布于 2017/01/12 10:18
字数 826
阅读 106
收藏 0

题目描述

    子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
    子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断
两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。

示例:
IP地址        192.168.0.1
子网掩码       255.255.255.0
转化为二进制进行运算:
IP地址        11010000.10101000.00000000.00000001
子网掩码      11111111.11111111.11111111.00000000
AND运算
             11000000.10101000.00000000.00000000
转化为十进制后为:
             192.168.0.0

IP地址         192.168.0.254
子网掩码        255.255.255.0
转化为二进制进行运算:
IP地址        11010000.10101000.00000000.11111110
子网掩码       11111111.11111111.11111111.00000000
AND运算
              11000000.10101000.00000000.00000000
转化为十进制后为:
              192.168.0.0

    通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,
所以这二台计算机可视为是同一子网络。
/**
 * 功能: 判断两台计算机IP地址是同一子网络。
 * 输入参数: String Mask: 子网掩码,格式:“255.255.255.0”;
 *           String ip1: 计算机1的IP地址,格式:“192.168.0.254”;
 *           String ip2: 计算机2的IP地址,格式:“192.168.0.1”;
 *
 * 返回值:0:IP1与IP2属于同一子网络;
 *        1:IP地址或子网掩码格式非法;
 *        2:IP1与IP2不属于同一子网络
 */
public int checkNetSegment(String mask, String ip1, String ip2) {
    /*在这里实现功能*/
    return 0;
}

输入描述

输入子网掩码、两个ip地址

输出描述

得到计算结果

输入例子

255.255.255.0
192.168.224.256
192.168.10.4

输出例子

1

算法实现

import java.util.Scanner;

/**
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            String subnet = scanner.next();
            String ip1 = scanner.next();
            String ip2 = scanner.next();

            System.out.println(subnetJudgement(subnet, ip1, ip2));
        }

        scanner.close();
    }

    private static int subnetJudgement(String subnet, String ip1, String ip2) {

        //  1:IP地址或子网掩码格式非法
        if (!ipValidate(subnet) || !ipValidate(ip1) || !ipValidate(ip2)) {
            return 1;
        }

        int subnetInt = ipStrToInt(subnet);

        //  1:子网掩码格式非法
        if (!subnetMaskValidate(subnetInt)) {
            return 1;
        }

        int b = ipStrToInt(ip2);
        int a = ipStrToInt(ip1);

        // 0:IP1与IP2属于同一子网络
        if ((a & subnetInt) == (b & subnetInt)) {
            return 0;
        }
        // 2:IP1与IP2不属于同一子网络
        else {
            return 2;
        }



    }

    /**
     * 验证IP地址的格式是否正确
     *
     * @param ip IP地址
     * @return true:格式正确,false:格式不正确
     */
    private static boolean ipValidate(String ip) {
        String[] part = ip.split("\\.");

//        if (part.length != 4) {
//            return false;
//        }

        for (String s : part) {
            try {
                int num = Integer.parseInt(s);
                if (num < 0 || num > 255) {
                    return false;
                }
            } catch (Exception ex) {
                return false;
            }
        }

        return true;
    }

    /**
     * 子网掩码验证,网络号部分全为“1”和主机号部分全为“0”
     *
     * @param ip
     * @return
     */
    private static boolean subnetMaskValidate(int ip) {
        boolean hasZero = false;
        int and = 0x80000000;
        while (and != 0) {
            // 所处理的位位置为0
            if ((ip & and) == 0) {
                // 说明出现了0
                hasZero = true;
            }
            // 如果位置为1
            else {
                // 之前已经有0出现过,那说明1是不连续的,所以子网掩码不合法
                if (hasZero) {
                    return false;
                }
            }

            // 无符号右移一位
            and >>>= 1;
        }

        return true;
    }

    /**
     * 将点分十进制的IP地址转换成整数表示
     *
     * @param ip 点分十进制的IP地址
     * @return IP地址的整数表
     */
    private static int ipStrToInt(String ip) {
        String[] part = ip.split("\\.");
        int intIP = 0;

        for (int i = 0; i < part.length; i++) {
            int t = Integer.parseInt(part[i]);
            intIP += t << (24 - 8 * i);
        }

        return intIP;
    }
}

© 著作权归作者所有

上一篇: 蛇形矩阵
下一篇: 素数伴侣
一贱书生
粉丝 20
博文 724
码字总数 600123
作品 0
私信 提问
怎样判断两个IP是否在同一局域网?

怎样判断两个IP是否在同一局域网? 1.在windows中,开始->cmd 进入Dos,输入ipconfig /all,查看网络配置。 2.首先看子网掩码(Subnet Mask),如果两台机器子网掩码不一致,不在一个局域网。...

天若清弦
2017/09/20
0
0
python-判断2个IP地址是否属于同一网段

python新手上路,以前主要搞网络路由交换这一块,现在用python做一下简单的关于网络的脚本,记录一下学习历程。 1个IP是否属于1个网段,需要3前提条件,2个IP,1个子网掩码。 例如192.168.1...

bang251026052
2017/07/08
0
0
网络之IP地址、子网掩码、网关关联

导读 IP地址?子网掩码? 网关?我们经常混淆这些知识,同时面试的时候又容易被问。下面我们就一个一个的来介绍他们的区别和用途。 网络无处不在,深深影响着我们的生活。而下面几点知识是我们在...

问题终结者
07/10
9
0
Linux网络编程——网络协议入门

我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信。北京的某一块网卡送出信号,深圳的另一块网卡居然就收到了,两者实际上根本不知道对方的物理...

Mike__Jiang
2015/03/13
0
0
文件传输——TCP/IP协议介绍总结

一、链路层 数据链路层的工作特性: 1.为IP模块发送和接收IP数据报 2.为ARP模块发送ARP请求和接收ARP应答(ARP:地址解析协议,将IP地址转换成MAC地址) 3.为RARP发送RARP请求和接收RARP应答...

海洋飞翔
07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分页查询

一、配置 /*** @author beth* @data 2019-10-14 20:01*/@Configurationpublic class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor(){ ......

一个yuanbeth
昨天
5
0
在LINQPad中使用Ignite.NET

LINQPad是进行.NET开发的一款优秀工具,非常有利于Ignite.NET API的快速入门。 入门 下载LINQPad:linqpad.net/Download.aspx,注意要选择64位操作系统的AnyCPU版本; 安装Ignite.NET的NuGet...

李玉珏
昨天
7
0
JS其他类型值转化为Boolean类型规则

本文转载于:专业的前端网站➤JS其他类型值转化为Boolean类型规则 由于最近在笔试的时候,发现好多关于其他类型转化为Boolean类型的题目,因此总结一下! 一、String类型转化为Boolean 1.转化...

前端老手
昨天
6
0
EurekaClient自动装配及启动流程解析

在上篇文章中,我们简单介绍了EurekaServer自动装配及启动流程解析,本篇文章则继续研究EurekaClient的相关代码 老规矩,先看spring.factories文件,其中引入了一个配置类EurekaDiscoveryClie...

Java学习录
昨天
11
0
析构函数是否必须为虚函数?为何?

p517 在C++中,基类指针可以指向一个派生类的对象。如果基类的析构函数不是虚函数,当需要delete这个指向派生类的基类指针时,就只会调用基类的析构函数,而派生类的析构函数无法被调用。容易...

天王盖地虎626
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部