【问题标题】:Obtaining an ipv4 subnetmask with Java使用 Java 获取 ipv4 子网掩码
【发布时间】:2026-01-16 11:10:02
【问题描述】:

我正在写作,因为我在为自己的 PC 找到正确的子网掩码时遇到了一些问题。 我已经阅读了How to get subnet mask of local system using java? 的问题,但如果我尝试:

InetAddress thiscomputer = InetAddress.getLocalHost();
NetworkInterface thisNetworkInterface = NetworkInterface.getByInetAddress(thiscomputer);
int thiscomputerSubnetMask = thisNetworkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength();
System.out.println("This pc subnetmask: "+thiscomputerSubnetMask);

它会写 64。thisNetworkInterface.getInterfaceAddresses() 对象只有一个元素,它是 128。

现在,我正在寻找一个可以在 ipv4 协议中使用的数字,而我的实际子网掩码是 255.255.255.240,所以我正在寻找 16(256-240),但我不能从我知道的方法中得到它。

我什至不明白 64 或 128 可能代表什么! 谁能帮帮我?

【问题讨论】:

  • 也许你得到了 ipv6 的东西..+ 你没有使用同一个类

标签: java mask subnet


【解决方案1】:

使用下面的代码查看/64 中的地址是什么(答案会让你大吃一惊)。答案是 .getInterfaceAddresses().get(0) 不可扩展,可能不会一直返回您期望的答案。

InetAddress localHost = Inet4Address.getLocalHost();
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost);

for (InterfaceAddress address : networkInterface.getInterfaceAddresses()) {
    System.out.println(address.getAddress() + "/" + address.getNetworkPrefixLength());
}

编辑:这是我的机器(Mac)的输出。

/fe80:0:0:0:5ab0:35ff:fe6e:cdc3%6/64
/172.31.255.21/28

【讨论】:

  • 你的方法回答我:/fe80:0:0:0:e416:af9b:f0b9:f57f%10/64 /192.168.1.2/128
  • 是的,这就是我要表达的意思。 NetworkInterface.getByInetAddress() 将返回接口(在大多数情况下,它可以同时支持 ipv6 和 ipv4)。我觉得有趣的是 192.168.1.2 给你一个 /128 (这应该由 ::1 ipv6 地址列出)。我不太明白您是如何获得 IPv4 地址的 /128 的。
  • 我不明白!这是我的问题!我在任何地方都找不到 255.255.255.240 或 16
  • 我更新了我在自己的 main() 中运行代码片段时得到的输出。