Java SubnetUtils抛出java.lang.IllegalArgumentException

时间:2013-07-23 05:43:32

标签: java

我有以下代码,基本上是基于ipaddress打印的东西。

    private static void getInfo(String ipAddress) {
for (String cidr : myNetworkList) {             
                if (InetAddressValidator.getInstance().isValid(ipAddress)) {                    
                    if (cidr.equals(ipAddress)) {
                        //Do something
                        break;
                    }
                }
                 else {
                    SubnetUtils subnetUtils = new SubnetUtils(cidr);
                    if (subnetUtils.getInfo().isInRange(ipAddress)) {                       
                        //Do something else             
                        break;
                    }
                }


            }       
}

当我提供有效的IP地址作为参数时,该方法可以正常工作,如-17.151.126.28。但是,如果我以CIDR表示法给出IP地址,例如-17.24.84.0/24,我得到以下错误 -

Exception in thread "main" java.lang.IllegalArgumentException: Could not parse [17.24.84.0/24]

我不知道如何解决这个问题。我在某处读到了Subnet的问题,因为它不支持IpV4地址。我不是网络专家,所以我不知道问题是关于子网,还是我应该使用备用库?

2 个答案:

答案 0 :(得分:1)

阅读isInRange(String address)

的JavaDoc
  

Parameters: address - A dot-delimited IPv4 address, e.g. "192.168.0.1"

您正在传递17.24.84.0/24,这不是以点分隔的IPv4地址。

您的ipAddress变量包含CIDR表示法中的String

答案 1 :(得分:0)

以下是如何做到的。

public boolean testCIDRSubnet(String cidr, String cidrSubnetCandidate) {
    if ("0".equals(cidr.substring(cidr.indexOf("/")+1))) return true;
    if ("0".equals(cidrSubnetCandidate.substring(cidrSubnetCandidate.indexOf("/")+1))) return false;
    SubnetUtils utils = new SubnetUtils(cidrSubnetCandidate);
    String lowIp = utils.getInfo().getLowAddress();
    String highIp = utils.getInfo().getHighAddress();
    utils = new SubnetUtils(cidr);
    return utils.getInfo().isInRange(lowIp) && utils.getInfo().isInRange(highIp);
}

第二个参数接收CIDR IP范围子网候选,如果它是cidr的完整子网,则该方法返回true。对“/ 0”cidrs的前两次检查是因为SubnetUtils无法将其识别为有效。