检查ipAddress是否在私有范围内

AKI*_*WEB 11 java

我如何检查IP地址是否属于私有类别?

if(isPrivateIPAddress(ipAddress)) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激.

更新的答案

private static boolean isPrivateIPAddress(String ipAddress) {

        InetAddress ia = null;

        try {
            InetAddress ad = InetAddress.getByName(ipAddress);
            byte[] ip = ad.getAddress();
            ia = InetAddress.getByAddress(ip);
        } catch (UnknownHostException e) {

            e.printStackTrace();
        }

        return ia.isSiteLocalAddress();
    }
Run Code Online (Sandbox Code Playgroud)

我写了这个方法,它对我来说很好.但有没有这种方法不起作用的情况?我只是想确保它适用于每个案例.

Nic*_*ick 18

编辑:正确的方法是InetAddress.isSiteLocalAddress().

用于检查InetAddress是否为站点本地地址的实用程序例程.

返回:一个布尔值,指示InetAddress是否是站点本地地址; 如果地址不是站点本地单播地址,则返回false.

请参阅评论以进行讨论.


Bil*_*hor 5

这是我生成的一个快速黑客来测试我自己的地址。

import java.net.InetAddress;
import java.net.UnknownHostException;

public class LocalAddress {

    public static void main(String[] args) {
        InetAddress address = null;
        try {
            address = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
             e.printStackTrace();
        }
        if (address.isSiteLocalAddress()) {
            System.out.println("Site Local Address: " + address.getHostAddress());
        } else {
            System.out.println("Routeable Address: " + address.getHostAddress());
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

编辑:此代码尚未针对链接本地地址、本地主机或为文档保留的地址块进行测试。前两种情况具有返回它们的方法。最后一个在类的文档中没有被引用。


sof*_*fia 5

首先,专用网络可以在以下范围内的任何地方使用 IPv4 地址:

  • a) 192.168.0.0 - 192.168.255.255(65,536 个 IP 地址)
  • b) 172.16.0.0 - 172.31.255.255(1,048,576 个 IP 地址)
  • c) 10.0.0.0 - 10.255.255.255(16,777,216 个 IP 地址)

正如我们从 Inet4Address.java 中的 isSiteLocalAddress 方法中看到的:

 public boolean isSiteLocalAddress() {
    // refer to RFC 1918
    // 10/8 prefix
    // 172.16/12 prefix
    // 192.168/16 prefix
    int address = holder().getAddress();
    return (((address >>> 24) & 0xFF) == 10)
        || ((((address >>> 24) & 0xFF) == 172)
            && (((address >>> 16) & 0xF0) == 16))
        || ((((address >>> 24) & 0xFF) == 192)
            && (((address >>> 16) & 0xFF) == 168));
}
Run Code Online (Sandbox Code Playgroud)

因此不满足情况 b) 172.16.0.0 - 172.31.255.255(1,048,576 个 IP 地址)。但是你可以很容易地写出你自己的版本如何判断一个地址是否是私人地址。这是我的版本:

import com.google.common.net.InetAddresses;

private static boolean isPrivateV4Address(String ip) {
    int address = InetAddresses.coerceToInteger(InetAddresses.forString(ip));
    return (((address >>> 24) & 0xFF) == 10)
            || ((((address >>> 24) & 0xFF) == 172) 
              && ((address >>> 16) & 0xFF) >= 16 
              && ((address >>> 16) & 0xFF) <= 31)
            || ((((address >>> 24) & 0xFF) == 192) 
              && (((address >>> 16) & 0xFF) == 168));
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是不正确的。情况 b) 得到满足,因为掩码是“0xF0”。测试 `InetAddress.getByName("172.31.255.255").isSiteLocalAddress()` 返回 true 是微不足道的。 (4认同)