生成IPv4范围中的所有IP地址

时间:2010-01-07 06:42:05

标签: java networking network-programming

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

5 个答案:

答案 0 :(得分:10)

修改:我之前的回答已经从128.0.0.0升级到255.255.255.2550.0.0.0再到127.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,则这将是一个无限循环(因为所有int始终是<= Integer.MAX_VALUE

答案 1 :(得分:3)

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

因此,根据您的要求,您可能需要检查保留地址并将其保留。

答案 2 :(得分:2)

一切可能吗? 0.0.0.0到255.255.255.255,它是0到0xFFFFFFFF

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

请注意两件事:  1.有很多地址,所以效率不高。  2.并非所有IP地址都有效(并且有很多地址可能无法覆盖)。

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