将ip地址与子网掩码表相匹配... Java中最好的方法是什么?

Boo*_*ean 10 java network-programming

这是场景......我有一个子网表.(见下文)我有一个IP地址.我想基于表中的查找找出ip地址所属的子网.然后,该关联将用于确定用户所处的位置.这是一个私人网络空间,因此位置查找的标准互联网将不适用.什么是最好的方法?我是否需要将ip地址分解为数字部分并对所有子网进行逐位比较..或者Java API中是否有内置工具可以让我的生活更轻松地将IP地址与子网掩码进行比较?

我主要是寻找将ipaddress与给定子网掩码进行比较的最佳方法,并确定是匹配,还是不匹配.可选.有关如何存储列表和使用最少操作进行搜索的任何提示也将受到赞赏.

理想情况下,我会做类似的事情:

List subnetInfo = null;

subnetInfo = findSubnet('192.168.0.1');  //value null if nothing found

....

//return null if nothing found
List findSubnet(String ipaddress) {
   List subnetDetails = null;
   .... code here ...
   return subnetDetails;
}
Run Code Online (Sandbox Code Playgroud)

表1:子网的示例列表

dk-ballerup-gen-off-v411        10.172.80.0/21  NANR-denmark-ballerup-metallbuen66-ground-first-floors-incl-dhcp-(sr14585203)
ae-dubai-ofssl-gen-off-v410  10.172.88.0/24  NANR-arab-emirates-ofssl-iflex-general-office-v410-(sr12781477)
ru-stpetersburg-gen-off-v411    10.172.89.0/24  NANR-russia-stpetersburg-general-office-incl-dhcp (bsteinba)
Run Code Online (Sandbox Code Playgroud)

ska*_*man 3

Apache Commons Net有一个SubnetUtils用于此类事情,包括确定给定的 IP 地址是否在给定的子网内。

简单的例子:

    String[] subnetsMasks = { ... };
    Collection<SubnetInfo> subnets = new ArrayList<SubnetInfo>();
    for (String subnetMask : subnetsMasks) {
        subnets.add(new SubnetUtils(subnetMask).getInfo());
    }

    String ipAddress = ...;
    for (SubnetInfo subnet : subnets) {
        if (subnet.isInRange(ipAddress)) {
            System.out.println("IP Address " + ipAddress + " is in range " + subnet.getCidrSignature());
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果 CIDR 掩码跨越字节边界怎么办?更多行代码。还有更多错误。这个问题在图书馆已经得到解决,有更好的东西可以花我们的精力。 (8认同)
  • 因为将 CIDR 掩码转换为数字是一种很容易出错的任务。当你可以把它下架时,为什么还要重新实现它呢? (3认同)