Javaでサブネットマスクを計算する方法

  • 13
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Javaでサブネットを計算し、含まれる範囲を計算しようとした際、意外と情報が見つからなかったのでメモしておきます。

ライブラリを用意

今回は自力で実装はせず、Apache Commonsの、「commons-net」を使います。

mavenなら下記のように読み込んでください。

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.3</version>
</dependency>

もしくは下記からダウンロードしてきてクラスパスを通して下さい。

http://mvnrepository.com/artifact/commons-net/commons-net/

使い方

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