Javaでサブネットを計算し、含まれる範囲を計算しようとした際、意外と情報が見つからなかったのでメモしておきます。
#ライブラリを用意
今回は自力で実装はせず、Apache Commonsの、「commons-net」を使います。
mavenなら下記のように読み込んでください。
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
もしくは下記からダウンロードしてきてクラスパスを通して下さい。
#使い方
IPとサブネットマスクを「SubnetUtils」クラスに読み込ませた後、SubnetUtilsからサブネット情報インスタンスを取得します。
その後、サブネット情報インスタンスから、getHighAddress()というメソッドで、指定したサブネット情報の上限を取得します。
プログラム例
public static void main(String args[]){
{
String ip = "192.168.0.1";
String subnetMask = "255.255.0.0";
// IPとサブネットマスクを読み込む
SubnetUtils subnetUtils = new SubnetUtils(ip, subnetMask);
SubnetInfo subnetInfo = subnetUtils.getInfo();
// 計算
System.out.println("IP : " + ip);
System.out.println("サブネットマスク : " + subnetMask);
System.out.println("下限 : " + subnetInfo.getLowAddress());
System.out.println("上限 : " + subnetInfo.getHighAddress());
System.out.println("含まれるIP数 : " + subnetInfo.getAddressCount());
System.out.println("CIDR表記 : " + subnetInfo.getCidrSignature());
}
{
// CIDR表記で読み込む
String subnet = "192.168.0.0/16";
SubnetUtils subnetUtils = new SubnetUtils(subnet);
SubnetInfo subnetInfo = subnetUtils.getInfo();
System.out.println("サブネット : " + subnet);
System.out.println("下限 : " + subnetInfo.getLowAddress());
System.out.println("上限 : " + subnetInfo.getHighAddress());
}
}
出力結果
IP : 192.168.0.1
サブネットマスク : 255.255.0.0
下限 : 192.168.0.1
上限 : 192.168.255.254
CIDR表記 : 192.168.0.1/16
含まれるIP数 : 65534
サブネット : 192.168.0.0/16
下限 : 192.168.0.1
上限 : 192.168.255.254
他にも、指定したIPがそのサブネット内に含まれているかどうかなども判定出来るらしいです。
#参考情報
下記を参考にさせて頂きました。
http://hiroaki-kono.hatenablog.com/entry/2014/04/30/213435
http://mvnrepository.com/artifact/commons-net/commons-net/
http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/util/SubnetUtils.html
http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/util/SubnetUtils.SubnetInfo.html