2012年05月09日

Javaで使えるIPアドレス管理ライブラリ

JavaでIPアドレスからネットワーク、ブロードキャスト・アドレスを算出したい、あるIPアドレスが指定したネットワークに含まれるか否かを判断したい、こんな時どうしますか?

僕だったら、既に誰かが作った便利なライブラリ(API)が存在するはず、ということでまずは探してみます。
ところが意外なことにこういった用途に使えるJavaライブラリは簡単には見つかりません。

今日はこんな希望を叶えてくれる幾つかのクラス(OpenSolaris/CDDLライセンス)をご紹介します。

まずは、こちらのページからNetowrk.java、IPAddress.java、ResourceStrings.java、ValidationException.javaクラスをダウンロードします。

21

もともとはSolarisに含まれるdhcpmgrというDHCP管理ツール向けコードのようですね。

データサービス構成ツールと DHCP 管理ツール (Solaris DHCP サービス開発ガイド)
HCP サービスの構成機能は、dhcpmgr および dhcpconfig 構成ツールによりシステム管理者に提供されます。モジュールをツールのユーザーから使用できるようにし、基盤となるデータサービスの ...


ダウンロードしたファイルをクラス・パスに追加すれば準備完了。

40

面倒だという方はjarファイルも用意したので、こちらをクラス/ビルド・バスに追加して下さい。

 os-networkmgr-utils.jarのダウンロード

それでは早速、具体的な使い方を見てみましょう。


ネットワーク・アドレス、ブロードキャスト・アドレスを計算(取得)する


IPアドレスが10.255.124.1/18ビットの場合、このアドレスが含まれるネットワーク・アドレス、ブロードキャスト・アドレスは次のようなコードで求めることができます。

[サンプルコード]

String ipAddr = "10.255.124.1";
String mask = "255.255.192.0";

try {
  Network network = new Network(ipAddr, mask);
  System.out.println("ネットワーク・アドレス:\t" + network.getNetworkNumber());
  System.out.println("ブロードキャスト・アドレス:\t" + network.getBroadcastAddress());
} catch (ValidationException e) {
  e.printStackTrace();
}

[説明]


コンストラクタでターゲットとなるIPアドレスとマスクを指定し、Networkオブジェクトを生成します。
後は簡単、getNetworkNumberメソッドを呼び出してネットワーク・アドレスを表すIPAddressオブジェクトを取得出来ます。これと同様にgetBroadcastAddress()メソッドを使えばネットワーク・アドレスを表すIPAddressオブジェクトを取得出来ます。

[実行結果]

ネットワーク・アドレス:   10.255.64.0 
ブロードキャスト・アドレス: 10.255.127.255


ネットワーク・アドレスにIPアドレスが含まれるか否かを判断する


例として10.255.64.0/18というネットワークに、指定したIPアドレスが含まれるか否かを判断するコードを考えてみます。


[サンプルコード]

try {
  Network network = new Network("10.255.64.0", "255.255.192.0");
  String[] addrs = {"10.254.128.102", "10.255.127.1"};
  for (String addr: addrs) {
    IPAddress ipAddr = new IPAddress(addr);
    if (network.containsAddress(ipAddr)) {
      System.out.println(ipAddr.toString() + "¥t はネットワークに含まれます。");
    } else {
      System.out.println(ipAddr.toString() + "¥t はネットワークに含まれません。");
    }
  }
} catch (ValidationException e) {
  e.printStackTrace();
} 

[説明]

Networkオブジェクトの生成は既に説明しましたね。このNetworkオブジェクトのもつcontainsAddress()メソッドの引数に判断したいアドレスを表すIPAddressオブジェクトを指定すると、その結果がbooleanで戻ります。

[実行結果]

10.254.128.102 はネットワークに含まれません。 
10.255.127.1  はネットワークに含まれます。


IPアドレス・レンジから利用可能なアドレスの数を算出する


10.255.64.91から10.255.127.12の範囲がレンジとなる場合、利用可能なIPアドレスの数は何個でしょうか?
簡単に自作できそうな気もしますが、IPAddressクラスを使えば簡単に計算出来ます。

[サンプルコード]

try {
  IPAddress startIpAddr = new IPAddress("10.255.64.91");
  IPAddress endIpAddr = new IPAddress("10.255.127.12");
  long numUsableAddr = endIpAddr.getBinaryAddress() - (startIpAddr.getBinaryAddress() - 1);
  System.out.println("利用可能なアドレス数: " + numUsableAddr);
} catch (ValidationException e) {
  e.printStackTrace();
}

[説明]

IPAddressオブジェクトのもつgetBinaryAddress()メソッドを呼び出すとIPアドレスの大きさを表すlong値が戻ります。
開始、終端となるIPアドレスの差を取れば、利用可能なIPアドレスの数を算出することが出来ます。
サンプルコードでは開始アドレスも利用可能なアドレスに含める為に-1しています。

[実行結果]

利用可能なアドレス数: 16050


IPアドレスの振り分け、IPレンジに含まれる有効なアドレス数を計算したいが、1から作るには時間・コストが見合わないという場合には、一度利用を検討してみてはどうでしょうか?

Sunが開発したDHCP管理ツールという背景も考えると、ネットワーク・プログラミングの基礎テクニックを学びたいJavaエンジニアも一度は読んでおきたいソース・コードかもしれませんね。





Posted by netbuffalo at 03:27│Comments(0)TrackBack(0)Java | ネットワーク


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/3936271

コメントする

名前
URL
 
  絵文字