0

我有下面的代码,基本上是基于 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]

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

4

2 回答 2

1

阅读 JavaDocisInRange(String address)

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

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

您的ipAddress变量包含一个StringCIDR 表示法。

于 2013-07-23T06:05:42.673 回答
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 不认为这是有效的。

于 2014-01-16T21:43:00.217 回答