10

Net_IPv4およびNet_IPv6に似ているが、Java 用に作成されたパッケージを探しています。次のことができる必要があります。

  • アドレスが有効であることを確認します (例: 127.0.0.1 は有効ですが、127.0.0.257 は無効です)。
  • アドレスがサブネット内に含まれている場合に返します (例: 127.0.0.11 は 127.0.0.0/28 にあります)
  • 特定のサブネットのブロードキャスト アドレスを返します (例: 127.0.0.0/28 の場合は 127.0.0.15)。

次のこともできれば最高です。

  • サブネットのアドレスのリストを順番に返す
  • アドレスのリストを並べ替える

おそらく、これらすべてを行うパッケージを作成することもできますが、誰かがすでに問題を経験しており、おそらくより良い仕事をしている場合は、それを使用することに専念します. これをすべて実行できるパッケージを知っている人はいますか? IPv6 に拡張しているため、可能であれば IPv4 と IPv6 の両方で機能する必要があります。

助けていただければ幸いです。

4

5 に答える 5

6

CIDRUtilsが役立つかもしれません。CIDR 表記を IP 範囲に変換できます。

免責事項: 私は CIDRUtils の作成者です。

于 2013-02-23T14:20:39.827 に答える
5

IPAddress Java ライブラリは、サブネットを含むポリモーフィックな方法で IPv4 と IPv6 の両方をサポートします。javadoc はリンクから入手できます。免責事項: 私はプロジェクト マネージャーです。

リストしたすべてのユースケースは、IPv4 と IPv6 の両方で透過的にサポートされています。言い換えれば、以下のコードが入力文字列として IPv4 または IPv6 のいずれでも同じように機能するという意味で、他のほとんどのユーティリティとは異なります。

アドレスが有効かどうかを確認する

    String str = "::1";
    IPAddressString addrString = new IPAddressString(str);
    try {
         IPAddress addr = addrString.toAddress();
         ...
    } catch(IPAddressStringException e) {
        //e.getMessage provides validation issue
    }

アドレスがサブネット内に含まれている場合に返す

    String str = "1::1";
    String subnetStr = "1::/64";
    IPAddressString addrString = new IPAddressString(str);
    IPAddressString subnetString = new IPAddressString(subnetStr);
    try {
         IPAddress addr = addrString.toAddress();
         IPAddress subnet = subnetString.toAddress();
         boolean isContained = subnet.contains(addr); //true in this case
         ...
    } catch(IPAddressStringException e) {
        //e.getMessage provides validation issue
    }

特定のサブネットのブロードキャスト アドレスを返す

    String subnet = "127.0.0.0/28";
    IPAddressString subnetString = new IPAddressString(subnet);
    try {
         IPAddress subnet = subnetString.toAddress();
         IPAddress broadcastAddr = subnet.getHighest();
         ...
    } catch(IPAddressStringException e) {
        //e.getMessage provides validation issue
    }

サブネットのアドレスのリストを順番に返す

    String subnet = "127.0.0.0/28";
    IPAddressString subnetString = new IPAddressString(subnet);
    try {
         IPAddress subnet = subnetString.toAddress();
         for(IPAddress addr : subnet) {
             ...
         }
    } catch(IPAddressStringException e) {
        //e.getMessage provides validation issue
    }

アドレスのリストを並べ替える

    List<IPAddressString> addrs; 
    Collections.sort(addrs); //IPAddressString implements Comparable

サブネット化されたネットワークのセットとアドレスのリストを取得します (AhmedRana への応答):

    IPAddress subnet = new IPAddressString("192.168.0.0/28").getAddress();
    IPAddress newSubnets = subnet.adjustPrefixLength(1, false);
    System.out.println(newSubnets); //192.168.0.0-8/29
    HashSet<IPAddress> subnetSet = new HashSet<IPAddress>();
    ArrayList<IPAddress> addrList = new ArrayList<IPAddress>();
    for(IPAddress addr : newSubnets.getIterable()) {
        subnetSet.add(addr.toPrefixBlock());
        addrList.add(addr);
    }
    System.out.println(subnetSet);//[192.168.0.0/29, 192.168.0.8/29]

    System.out.println(addrList);
                //[192.168.0.0/29, 192.168.0.1/29, 192.168.0.2/29,
                //192.168.0.3/29, 192.168.0.4/29, 192.168.0.5/29,
                //192.168.0.6/29, 192.168.0.7/29, 192.168.0.8/29,
                //192.168.0.9/29, 192.168.0.10/29, 192.168.0.11/29,
                //192.168.0.12/29, 192.168.0.13/29, 192.168.0.14/29,
                //192.168.0.15/29]

多くのアドレスが存在する可能性があります。新しいサブネット リストを取得するより効率的な方法は、次に示すように、プレフィックス ブロック サブネットを反復処理するプレフィックス ブロック イテレータを使用することです。

    IPAddress subnet = new IPAddressString("192.168.0.0/28").getAddress();
    IPAddress newSubnets = subnet.adjustPrefixLength(1, false);
    System.out.println(newSubnets); // 192.168.0.0-8/29
    Iterator<? extends IPAddress> iterator = newSubnets.prefixBlockIterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
    // 192.168.0.0/29
    // 192.168.0.8/29
于 2016-10-17T06:29:29.593 に答える
5

これは IPv4 専用ですが、 Commons Netの一部であるSubnetUtilsクラスには、探している機能があります。それに基づいて、IPv6 バージョンをコーディングし、それをプロジェクトに戻すことができます! :)

于 2009-02-18T18:30:40.370 に答える
4

私はcommons-ip-mathの主な貢献者です。これは、IPv4、IPv6、および AS 番号の最も一般的な計算を処理するための豊富な API を提供するオープンソース Java ライブラリです。最近オープンソース化されたばかりですが、RIPE NCC内で何年にもわたって実戦でテストされてきました。以下の使用方法をご覧ください。

(すべての例は、IPv6 および AS 番号に対して同様の構文で動作しています。代わりに、Ipv6、Ipv6Range、Asn、および AsnRange クラスを使用してください)。

  • アドレスが有効であることを確認します (例: 127.0.0.1 は有効ですが、127.0.0.257 は無効です)。
Ipv4.parse("127.0.0.1");     // IPv4 representation of "127.0.0.1"
Ipv4.parse("127.0.0.257");   // IllegalArgumentException
  • アドレスがサブネット内に含まれている場合に返します (例: 127.0.0.11 は 127.0.0.0/28 にあります)
Ipv4Range.parse("127.0.0.0/28").contains(Ipv4.parse("127.0.0.11"));  //true  
  • 特定のサブネットのブロードキャスト アドレスを返します (例: 127.0.0.0/28 の場合は 127.0.0.15)。
Ipv4Range.parse("127.0.0.0/28").start().upperBoundForPrefix(28)  // 127.0.0.15
  • サブネットのアドレスのリストを順番に返す
// Range types are Iterable
for (Ipv4 ipv4 : Ipv4Range.parse("127.0.0.0/30")) {
  System.out.println(ipv4);
}
// Will print:
127.0.0.0
127.0.0.1
127.0.0.2
127.0.0.3
  • アドレスのリストを並べ替える

ライブラリは範囲タイプのコンパレーター (サブネットのサイズの比較など) を提供しますが、単一アドレスのコンパレーターはありません。ただし、IPv4、IPv6、および ASN タイプは Comparable インターフェースを実装するため、独自に記述するのはかなり簡単です。

List<Ipv4> list = new ArrayList<Ipv4>();
list.add(Ipv4.of("0.0.0.3"));
list.add(Ipv4.of("0.0.0.4"));
list.add(Ipv4.of("0.0.0.2"));
list.add(Ipv4.of("0.0.0.1"));
Collections.sort(list, new Comparator<Ipv4>() {
    @Override
    public int compare(Ipv4 left, Ipv4 right) {
        return left.compareTo(right);
    }
});
System.out.println(list);
// Will print:
[0.0.0.1, 0.0.0.2, 0.0.0.3, 0.0.0.4]
于 2015-04-06T21:14:24.777 に答える
0

InetAddressクラスと関連するサブクラスは、開始するのに非常に適した場所です。

于 2009-02-18T07:42:21.770 に答える