How to check if an IP address is from a particular network/netmask in Java?

后端 未结 7 2191
北恋
北恋 2020-11-29 23:33

I need to determine if given IP address is from some special network in order to authenticate automatically.

7条回答
  •  鱼传尺愫
    2020-11-29 23:39

    here is an Version that works with IPv4 and IPv6 one with Prefix and one with Network Mask.

    /**
     * Check if IP is within an Subnet defined by Network Address and Network Mask
     * @param  ip
     * @param  net
     * @param  mask
     * @return
     */
    public static final boolean isIpInSubnet(final String ip, final String net, final int prefix) {
        try {
            final byte[] ipBin   = java.net.InetAddress.getByName(ip  ).getAddress();
            final byte[] netBin  = java.net.InetAddress.getByName(net ).getAddress();
            if(ipBin.length  != netBin.length ) return false;
            int p = prefix;
            int i = 0;
            while(p>=8) { if(ipBin[i] != netBin[i] ) return false; ++i; p-=8; }
            final int m = (65280 >> p) & 255;
            if((ipBin[i] & m) != (netBin[i]&m) ) return false;
    
            return true;
        } catch(final Throwable t) {
            return false;
        }
    }
    
    /**
     * Check if IP is within an Subnet defined by Network Address and Network Mask
     * @param  ip
     * @param  net
     * @param  mask
     * @return
     */
    public static final boolean isIpInSubnet(final String ip, final String net, final String mask) {
        try {
            final byte[] ipBin   = java.net.InetAddress.getByName(ip  ).getAddress();
            final byte[] netBin  = java.net.InetAddress.getByName(net ).getAddress();
            final byte[] maskBin = java.net.InetAddress.getByName(mask).getAddress();
            if(ipBin.length  != netBin.length ) return false;
            if(netBin.length != maskBin.length) return false;
            for(int i = 0; i < ipBin.length; ++i) if((ipBin[i] & maskBin[i]) != (netBin[i] & maskBin[i])) return false;
            return true;
        } catch(final Throwable t) {
            return false;
        }
    }
    

提交回复
热议问题