2009-02-17 37 views
9

Tôi đang tìm một gói tương tự như Net_IPv4Net_IPv6 nhưng được viết cho Java. Nó cần để có thể làm như sau:Tính toán và xác thực mạng IPv4/IPv6 cho Java?

  • Xác nhận địa chỉ là hợp lệ (ví dụ 127.0.0.1 là hợp lệ, 127.0.0.257 không phải là)
  • Return nếu một địa chỉ được chứa trong một subnet (ví dụ 127,0 .0.11 là trong 127.0.0.0/28)
  • Return địa chỉ quảng bá cho một subnet nhất định (ví dụ như cho 127.0.0.0/28 đó là 127.0.0.15)

nó sẽ là tuyệt vời nếu nó có thể thêm:

  • Return một danh sách các địa chỉ cho một subnet để
  • Sắp xếp một danh sách địa chỉ

tôi có lẽ có thể viết một gói để làm tất cả những điều này, nhưng nếu ai đó đã trải qua những rắc rối và nhiều khả năng có thực hiện một công việc tốt hơn, tôi là tất cả về việc sử dụng đó. Bất cứ ai biết về một gói hoặc gói như vậy có thể làm tất cả điều này? Chúng tôi đang mở rộng sang IPv6, vì vậy nó cần phải làm việc cho cả IPv4 và IPv6 nếu có thể.

Tôi đánh giá cao bất kỳ trợ giúp nào.

Trả lời

5

Nó chỉ cho IPv4, nhưng lớp SubnetUtils là một phần của Commons Net có các chức năng bạn đang tìm kiếm. Dựa trên đó bạn có thể mã hóa một phiên bản IPv6 và đóng góp nó trở lại dự án! :)

5

Có thể CIDRUtils có thể giúp bạn. Nó cho phép bạn chuyển đổi ký hiệu CIDR thành một dải IP.

Tuyên bố từ chối trách nhiệm: Tôi là tác giả của CIDRUtils.

+0

Cảm ơn cho đăng câu trả lời của bạn! Vui lòng đảm bảo đọc kỹ [FAQ on Self-Promotion] (http://stackoverflow.com/faq#promotion). Cũng lưu ý rằng nó là * bắt buộc * mà bạn đăng tuyên bố từ chối trách nhiệm mỗi lần bạn liên kết đến trang web/sản phẩm của riêng bạn. –

+0

@AndrewBarber Cảm ơn. Tôi đã không nhận thức được điều này. Tôi chỉ cố gắng giúp những người khác có cùng vấn đề với tôi. Dù sao, tôi sẽ từ chối trách nhiệm. –

3

Tôi là người đóng góp chính của commons-ip-math, một thư viện Java mã nguồn mở cung cấp API phong phú để xử lý các phép tính phổ biến nhất của số IPv4, IPv6 và AS. Mặc dù nó chỉ mới được mở nguồn nhưng nó đã được thử nghiệm trong nhiều năm qua bên trong RIPE NCC. Xem cách bạn có thể sử dụng nó bên dưới.

(Tất cả các ví dụ đều làm việc với cú pháp tương tự cho số IPv6 và AS. Chỉ cần sử dụng các lớp Ipv6, Ipv6Range, Asn và AsnRange).

  • Verify an address is valid (e.g. 127.0.0.1 is valid, 127.0.0.257 is not)
Ipv4.parse("127.0.0.1");  // IPv4 representation of "127.0.0.1" 
Ipv4.parse("127.0.0.257"); // IllegalArgumentException 
  • Return if an address is contained within a subnet (e.g. 127.0.0.11 is in 127.0.0.0/28)
Ipv4Range.parse("127.0.0.0/28").contains(Ipv4.parse("127.0.0.11")); //true 
  • Return the broadcast address for a given subnet (e.g. for 127.0.0.0/28 it's 127.0.0.15)
Ipv4Range.parse("127.0.0.0/28").start().upperBoundForPrefix(28) // 127.0.0.15 
  • Return a list of addresses for a subnet in order
// 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 
  • Sort a list of addresses

Mặc dù thư viện fers comparators cho các loại phạm vi (ví dụ: so sánh kích thước của mạng con), không có bộ so sánh nào cho các địa chỉ đơn lẻ.Tuy nhiên, nó là khá tầm thường để viết riêng của bạn từ IPv4, IPv6 và các loại ASN thực hiện các giao diện 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] 
+0

Theo: http://www.helpsystems.com/intermapper/ipv6-address-validation và http://v6decode.com/ "1: 2: 3: 4: 5: 6: 1.2.3.4" là hợp lệ IPv6, nhưng Ipv6.parse ("1: 2: 3: 4: 5: 6: 1.2.3.4") ném IllegalArgumentException. :/ – Pawel

+0

Đối với địa chỉ IPv6 có địa chỉ IPv4 được nhúng như trong ví dụ của bạn, thư viện phải tuân thủ http://tools.ietf.org/html/rfc4291#section-2.5.5. Vì vậy, nó hoặc là quá nghiêm ngặt so với các trang web hoặc bạn có thể đã tìm thấy một lỗi. Tôi sẽ điều tra. – jgonian

+0

@Pawel Tôi đã tạo https://github.com/jgonian/commons-ip-math/issues/2 để điều tra – jgonian

2

The IPAddress Java library hỗ trợ cả IPv4 và IPv6 một cách đa hình bao gồm mạng con. Javadoc có sẵn tại liên kết. Disclaimer: Tôi là người quản lý dự án.

Tất cả các trường hợp sử dụng mà bạn liệt kê đều được hỗ trợ cho cả IPv4 và Ipv6 một cách minh bạch. Nói cách khác, nó khác với hầu hết các tiện ích khác theo nghĩa là mã bên dưới hoạt động giống với IPv4 hoặc IPv6 làm các chuỗi đầu vào.

Xác minh nếu một địa chỉ có giá trị

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

Return nếu địa chỉ được chứa trong một subnet

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 
    } 

Return địa chỉ quảng bá cho một subnet cho

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 
    } 

Return một danh sách địa chỉ cho mạng con theo thứ tự

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 
    } 

Sắp xếp một danh sách địa chỉ

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

Nhận đặt mạng mạng cấp và danh sách địa chỉ (để đáp ứng AhmedRana):

IPAddress subnet = new IPAddressString("192.168.0.0/28").getAddress(); 
    IPAddress newSubnets = subnet.setPrefixLength(subnet.getPrefixLength() + 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] 
+0

Cảm ơn thư viện tuyệt vời. Thư viện của bạn có hỗ trợ những điều sau không. 1. Trả lại danh sách địa chỉ IP trong mạng con 2. Mạng con mạng, ví dụ: 192.168.0.0/28 subnet nó thành hai/29 mạng. Liệu nó có thể trả về cả hai mạng con được tạo ra? – AhmedRana

+0

Bạn được chào đón. Có, nó có thể làm những điều đó, tôi cập nhật câu trả lời với mã cho ví dụ của bạn, trong ví dụ của bạn có hai mạng con được tạo ra, mỗi mạng có 8 địa chỉ.Tuy nhiên, bây giờ tôi thấy rằng trong khi nó có thể nhận danh sách các mạng con khá dễ dàng và hiệu quả, việc đưa chúng vào danh sách hoặc thiết lập dễ dàng nhưng không hiệu quả đối với các mạng con lớn (lặp qua nhiều địa chỉ), vì vậy tôi sẽ thêm một phương thức iterator-block iterator để thực hiện điều đó một cách hiệu quả hơn, nó sẽ chỉ lặp qua danh sách các mạng con được chọn. –

+0

Cảm ơn Sean, Có phiên bản nào của thư viện này tương thích với JRE 1.5 (hoặc có cách nào để làm cho nó tương thích với 1.5) không? Tôi quan tâm đến chỉ IPv4.và tôi có một giới hạn rằng nó phải được chạy trên hệ thống có Java 5 – AhmedRana

Các vấn đề liên quan