【问题标题】:Generating all IP addresses in the IPv4 Range生成 IPv4 范围内的所有 IP 地址
【发布时间】:2010-01-07 06:42:05
【问题描述】:

生成所有可能的 IP v4 地址的有效方法是什么?除了在一个巨大的嵌套 for 循环中迭代所有字节。

【问题讨论】:

    标签: java networking network-programming


    【解决方案1】:

    编辑:我之前的回答会从128.0.0.0 变为255.255.255.2550.0.0.0127.255.255.255。大概你想从0.0.0.0 转到255.255.255.255,所以我已经编辑了我的解决方案来做到这一点。

    int i = -1;
    do {
      i++;
    
      int b1 = (i >> 24) & 0xff;
      int b2 = (i >> 16) & 0xff;
      int b3 = (i >>  8) & 0xff;
      int b4 = (i      ) & 0xff;
    
      //Now the IP is b1.b2.b3.b4
    
    } while(i != -1);
    

    注意:如果您对这个循环将如何结束感到困惑(即,如何将 1 加到 -1 足够多次使其再次变为 -1),请继续阅读 two's complement。基本上,在Integer.MAX_VALUE 中加一会得到Integer.MIN_VALUE,并且不会引发任何异常。


    旧答案。仍然可以访问所有 IP,但可能不是您想要的顺序:

    for(long n = Integer.MIN_VALUE; n <= Integer.MAX_VALUE; n++)
    {
      int i = (int)n;
    
      int b1 = (i >> 24) & 0xff;
      int b2 = (i >> 16) & 0xff;
      int b3 = (i >>  8) & 0xff;
      int b4 = (i      ) & 0xff;
    
      //Now the IP is b1.b2.b3.b4
    }
    

    请注意:如果循环控制变量是int 而不是long,这将是一个无限循环(因为所有ints 总是&lt;= Integer.MAX_VALUE)。

    【讨论】:

    • @S.马克:不,但没关系。 &amp; 0xff 将删除符号位。循环可能是从 0 到 -1(因为 -1 == 0xffffffff)。它仍然可以工作,因为Integer.MAX_VALUE + 1 === Integer.MIN_VALUE
    • @S.Mark:我不确定这是否是您的意思,但他可能想从 0 变为 0xffffffff。我已经更新了我的答案来做到这一点
    【解决方案2】:

    并非所有 IPv4 地址都是有效的,具体取决于它们的用途。请参阅此处有关保留地址块和链接 RFC 的部分:http://en.wikipedia.org/wiki/IPv4

    因此,根据您想要执行的操作,您可能需要检查保留地址并将其排除在外。

    【讨论】:

      【解决方案3】:

      一切皆有可能? 0.0.0.0 到 255.255.255.255 即 0 到 0xFFFFFFFF

      【讨论】:

      • 是的,从头到尾所有可能的有效 IP 地址。
      • 我明白了,我可以知道这样做的目的吗?用于检查有效 IP?
      • 啊,我明白了,要进行分配的 IP 地址映射,您需要一些我的参考链接中暂时没有的数据资源。
      【解决方案4】:

      您可以从初始化为零的无符号整数/长整数(32 位数据类型)开始,然后继续递增直到达到 0xffffffff。

      自增运算符通常比嵌套循环稍微高效。

      使用位掩码和位移运算符提取您感兴趣的任何给定字节。

      【讨论】:

        【解决方案5】:

        就“效率”而言,我认为没有比遍历所有可能值更好的方法了。

        请注意两点: 1.地址很多,效率不会那么高。 2. 并非所有 IP 地址都是有效的(而且有很多地址您可能不打算重复)。

        关于哪些 IP 地址有效的示例,请注意 224.0.0.0 和 239.255.255.255 之间的所有地址都是多播地址,所有以 127.x.x.x 开头的地址都是无效的,等等。

        【讨论】:

          猜你喜欢
          • 2017-11-27
          • 2015-11-20
          • 2015-09-06
          • 2012-05-12
          • 2019-07-13
          • 2018-10-08
          • 2011-08-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多