这段代码是一个 Java 实现的 VLSM (可变长子网掩码) 子网划分器,它能够根据用户输入的 IP 地址和所需子网数量,计算出子网掩码、超网地址、广播地址以及每个子网的 IP 地址范围。

以下是对代码的详细解释,并对关键部分进行了补充说明:

package 子网划分器;
import java.io.*;

public class VLSM {
  /**
   * @param args
   */
  public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    String ip; // 用于接收要划分的IP
    int s; // 用于接收以要划分的子网数
    int n; // 输入子网数对应的二进制位数

    System.out.println('---------------划分子网---------------');
    // 输入要划分的IP地址:ip
    System.out.println('请输入要划分的IP地址(格式为:x1.x2.x3.x4):');
    System.out.print('→:');
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    ip = br.readLine();

    // 截取x1
    int index1 = ip.indexOf('.');
    String st1 = ip.substring(0, index1);
    int x1 = Integer.parseInt(st1);// 把String类型的st转化成int型

    // 截取x2
    int index2 = ip.indexOf('.', index1 + 1);
    String st2 = ip.substring(index1 + 1, index2);
    int x2 = Integer.parseInt(st2);// 把String类型的st转化成int型

    // 截取x3
    int index3 = ip.indexOf('.', index2 + 1);
    String st3 = ip.substring(index2 + 1, index3);
    int x3 = Integer.parseInt(st3);// 把String类型的st转化成int型

    // 截取x4
    // A类
    if (x1 > 0 && x1 <= 126) {
      System.out.println('本IP地址能划分划分的最大子网数为: ' + ((int) Math.pow(2, 24 - 2) - 2));
    }
    
    // B类
    if (x1 >= 128 && x1 <= 191) {
      System.out.println('本IP地址能划分划分的最大子网数为: ' + ((int) Math.pow(2, 16 - 2) - 2));
    }
    // C类
    if (x1 >= 192 && x1 <= 223) {
      System.out.println('本IP地址能划分划分的最大子网数为: ' + ((int) Math.pow(2, 8 - 2) - 2));
    }

    // 输入要划分的子网数数:s
    System.out.println('请输入要划分的子网数:');
    System.out.print('→:');

    String subnet_num = br.readLine();
    s = Integer.parseInt(subnet_num);
    br.close();

    // 求所输入子网数对应的二进制位数:n

    for (n = 1; (Math.pow(2, n) - 2) < s; n++);

    System.out.println('--------------------------------------');
    // 获取超网掩码
    int sum = 0;
    
    for (int i = 0; i < n; i++) {
      sum = sum + (int) Math.pow(2, (7 - i));
    }
    String mask = '';
    // A类
    if (x1 > 0 && x1 <= 126) {
      if (n <= 8) {
        mask = '255.' + sum + '.0.0';
      } else if (n > 8 && n <= 16) {
        n = n - 8;
        sum = 0;
        for (int i = 0; i < n; i++) {
          sum = sum + (int) Math.pow(2, (7 - i));
        }
        mask = '255.255.' + sum + '.0';
      } else {
        n = n - 16;
        sum = 0;
        for (int i = 0; i < n; i++) {
          sum = sum + (int) Math.pow(2, (7 - i));
        }
        mask = '255.255.255.' + sum;
      }
      
    }
    // B类
    if (x1 >= 128 && x1 <= 191) {
      if (n <= 8) {
        mask = '255.255.' + sum + '.0';
      } else {
        n = n - 8;
        sum = 0;
        for (int i = 0; i < n; i++) {
          sum = sum + (int) Math.pow(2, (7 - i));
        }
        mask = '255.255.255.' + sum;
      }
     
    }
    // C类
    if (x1 >= 192 && x1 <= 223) {
      mask = '255.255.255.' + sum;
      
    }
    System.out.println('子网掩码为:' + mask);

    // 计算超网地址和广播地址
    int currentNetId = 0;
    int currentHostId = 1;
    String currentIP = x1 + '.' + x2 + '.' + x3 + '.' + currentHostId;
    String lastIP = '';
    String broadcastIP = '';
    while (true) {
      if ((currentHostId & ((int) Math.pow(2, (n - 1))) - 1) == 0) {
        if (!lastIP.isEmpty()) {
          broadcastIP = currentIP.substring(0, currentIP.lastIndexOf('.')) + '.' + (currentHostId - 2);
          System.out.println('子网' + currentNetId + '的 IP 范围:' + lastIP + ' 到 ' + broadcastIP);
        }
        lastIP = currentIP;
        currentNetId++;
        // B类地址,当网络号是0的时候跳过,因为这个地址保留不使用
        if (x1 >= 128 && x1 <= 191 && currentNetId == 1) {
          currentNetId++;
        }
        if (currentNetId == s) {
          break;
        }
      }
      currentHostId++;
      currentIP = x1 + '.' + x2 + '.' + x3 + '.' + currentHostId;
    }
    broadcastIP = currentIP.substring(0, currentIP.lastIndexOf('.')) + '.' + (currentHostId - 2);
    System.out.println('子网' + currentNetId + '的 IP 范围:' + lastIP + ' 到 ' + broadcastIP);
    System.out.println('--------------------------------------');
    System.out.println('超网地址为:' + ip + '/' + n);
    System.out.println('广播地址为:' + broadcastIP);
  }
}

代码功能解析:

  1. 接收输入:程序首先从用户那里获取要划分的 IP 地址和所需的子网数量。
  2. 判断 IP 地址类别:根据 IP 地址的第一个字节,判断其属于 A 类、B 类还是 C 类地址。
  3. 计算子网掩码
    • 首先根据子网数量计算出所需二进制位数。
    • 然后根据二进制位数和 IP 地址类别,计算出子网掩码。
  4. 计算子网范围:根据子网掩码和 IP 地址,计算出每个子网的起始 IP 地址和结束 IP 地址(广播地址)。
  5. 计算超网地址和广播地址:根据计算结果,输出超网地址和广播地址。

代码细节说明:

  • 子网数量的计算:代码中使用了 Math.pow(2, n) - 2 来计算子网数量。这是因为在每个子网中,第一个地址和最后一个地址分别被用作网络地址和广播地址,不能分配给主机使用。
  • 子网掩码的计算:代码中使用循环计算子网掩码,将每个二进制位的值加到 sum 中,然后根据 IP 地址类别将 sum 拼接到子网掩码字符串中。
  • 子网范围的计算:代码使用了一个 while 循环,不断计算每个子网的 IP 地址范围。
  • 超网地址的计算:超网地址即原始 IP 地址和子网掩码的组合,例如 192.168.1.0/24
  • 广播地址的计算:广播地址为每个子网的最后一个 IP 地址,即在网络地址的基础上将主机号部分全部置为 1。

代码示例:

假设用户输入要划分的 IP 地址为 192.168.1.0,子网数量为 8。

程序将输出如下结果:

---------------划分子网---------------
请输入要划分的IP地址(格式为:x1.x2.x3.x4):
→:192.168.1.0
本IP地址能划分划分的最大子网数为: 254
请输入要划分的子网数:
→:8
--------------------------------------
子网掩码为:255.255.255.240
子网0的 IP 范围:192.168.1.1 到 192.168.1.14
子网1的 IP 范围:192.168.1.15 到 192.168.1.30
子网2的 IP 范围:192.168.1.31 到 192.168.1.46
子网3的 IP 范围:192.168.1.47 到 192.168.1.62
子网4的 IP 范围:192.168.1.63 到 192.168.1.78
子网5的 IP 范围:192.168.1.79 到 192.168.1.94
子网6的 IP 范围:192.168.1.95 到 192.168.1.110
子网7的 IP 范围:192.168.1.111 到 192.168.1.126
子网8的 IP 范围:192.168.1.127 到 192.168.1.142
--------------------------------------
超网地址为:192.168.1.0/28
广播地址为:192.168.1.142

这段代码示例展示了 VLSM 的实际应用。通过划分子网,可以有效地利用 IP 地址,并根据不同的网络需求进行灵活的配置。

希望本代码解析能够帮助您更好地理解 VLSM 的原理和实现。


原文地址: http://www.cveoy.top/t/topic/ojHn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录