首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IPv4 4/IPv4 6网络计算和Java验证?

IPv4 4/IPv4 6网络计算和Java验证?
EN

Stack Overflow用户
提问于 2009-02-17 18:08:01
回答 5查看 12.1K关注 0票数 11

我正在寻找一个包,它类似于IPv4IPv6,但是是为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。

我很感谢你的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-02-18 18:30:40

它只适用于IPv4,但是SubnetUtils类是公域网的一部分,具有您想要的功能。在此基础上,您可以编写IPv6版本并将其贡献给项目!:)

票数 5
EN

Stack Overflow用户

发布于 2013-02-23 14:20:39

也许CIDRUtils能帮你。它使您能够将CIDR符号转换为IP范围。

免责声明:我是CIDRUtils的作者。

票数 8
EN

Stack Overflow用户

发布于 2016-10-17 06:29:29

IPAddress Java库以多态方式支持IPv4和IPv6,包括子网。javadoc在链接中可用。免责声明:我是项目经理。

您列出的所有用例都透明地支持IPv4和Ipv6。换句话说,它与大多数其他实用程序的不同之处在于,下面的代码与IPv4或IPv6作为输入字符串的工作方式相同。

验证地址是否有效

代码语言:javascript
复制
    String str = "::1";
    IPAddressString addrString = new IPAddressString(str);
    try {
         IPAddress addr = addrString.toAddress();
         ...
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }

如果子网中包含地址,则返回

代码语言:javascript
复制
    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(AddressStringException e) {
        //e.getMessage provides validation issue
    }

返回给定子网的广播地址。

代码语言:javascript
复制
    String subnetStr = "127.0.0.0/28";
    IPAddressString subnetString = new IPAddressString(subnetStr);
    try {
         IPAddress subnet = subnetString.toAddress();
         IPAddress broadcastAddr = subnet.getUpper();
         ...
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }

按顺序返回子网的地址列表

代码语言:javascript
复制
    String subnetStr = "127.0.0.0/28";
    IPAddressString subnetString = new IPAddressString(subnetStr);
    try {
         IPAddress subnet = subnetString.toAddress();
         for(IPAddress addr : subnet.getIterable()) {
             ...
         }
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }

对地址列表排序

代码语言:javascript
复制
    List<IPAddressString> addrs; 
    Collections.sort(addrs); //IPAddressString implements Comparable

获取一组子网网络和地址列表(响应于AhmedRana):

代码语言:javascript
复制
    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]

可能有很多地址。获得新子网列表的更有效方法是使用前缀块迭代器,它遍历前缀块子网,如下所示:

代码语言:javascript
复制
    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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/558038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档