【发布时间】:2010-01-07 06:42:05
【问题描述】:
生成所有可能的 IP v4 地址的有效方法是什么?除了在一个巨大的嵌套 for 循环中迭代所有字节。
【问题讨论】:
标签: java networking network-programming
生成所有可能的 IP v4 地址的有效方法是什么?除了在一个巨大的嵌套 for 循环中迭代所有字节。
【问题讨论】:
标签: java networking network-programming
编辑:我之前的回答会从128.0.0.0 变为255.255.255.255 到0.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,这将是一个无限循环(因为所有ints 总是<= Integer.MAX_VALUE)。
【讨论】:
& 0xff 将删除符号位。循环可能是从 0 到 -1(因为 -1 == 0xffffffff)。它仍然可以工作,因为Integer.MAX_VALUE + 1 === Integer.MIN_VALUE
并非所有 IPv4 地址都是有效的,具体取决于它们的用途。请参阅此处有关保留地址块和链接 RFC 的部分:http://en.wikipedia.org/wiki/IPv4
因此,根据您想要执行的操作,您可能需要检查保留地址并将其排除在外。
【讨论】:
一切皆有可能? 0.0.0.0 到 255.255.255.255 即 0 到 0xFFFFFFFF
【讨论】:
您可以从初始化为零的无符号整数/长整数(32 位数据类型)开始,然后继续递增直到达到 0xffffffff。
自增运算符通常比嵌套循环稍微高效。
使用位掩码和位移运算符提取您感兴趣的任何给定字节。
【讨论】:
就“效率”而言,我认为没有比遍历所有可能值更好的方法了。
请注意两点: 1.地址很多,效率不会那么高。 2. 并非所有 IP 地址都是有效的(而且有很多地址您可能不打算重复)。
关于哪些 IP 地址有效的示例,请注意 224.0.0.0 和 239.255.255.255 之间的所有地址都是多播地址,所有以 127.x.x.x 开头的地址都是无效的,等等。
【讨论】: