放課後プログラミング

調べたことや考えたことなどを忘れないために書きます。

IPアドレスがサブネットに含まれるかどうかの計算

自分で計算しようとすると少し手間がかかりそうだけど、apacheが提供しているcommons-netに含まれるSubnetUtilsを利用すると簡単に実現できます。
http://mvnrepository.com/artifact/commons-net/commons-net/

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

利用方法は下記のような感じ。

SubnetUtils subnet = new SubnetUtils("192.168.0.0/16");
subnet.getInfo().isInRange("192.168.2.1");  // ==> true
subnet.getInfo().isInRange("192.169.2.1");  // ==> false
subnet.getInfo().isInRange("192.168.0.0");  // ==> false
subnet.getInfo().isInRange("192.168.255.255");  // ==> false

コンストラクタで指定したネットワークのネットワークアドレスとブロードキャストアドレスでtrueを返したい場合は下記のようにする。

SubnetUtils subnet = new SubnetUtils("192.168.0.0/16");
subnet.setInclusiveHostCount(true);
subnet.getInfo().isInRange("192.168.2.1");  // ==> true
subnet.getInfo().isInRange("192.169.2.1");  // ==> false
subnet.getInfo().isInRange("192.168.0.0");  // ==> true
subnet.getInfo().isInRange("192.168.255.255");  // ==> true

コンストラクタはCIDR表記をせずにIPアドレスサブネットマスクを分けて書くことも可。

SubnetUtils subnet = new SubnetUtils("192.168.0.0", "255.255.0.0");


詳しくは下記
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