如何遍历IP范围?
在Python中,遍历一个IP地址范围最简单的方法是什么呢?我看到了一些例子,但都没有对我有效。我尝试了以下这种方法,运行得很好,但当到达范围的末尾时,它不会停止循环。比如,我会通过命令行指定以下参数
python loop.py 1.0.0.0 2.0.0.0
但是当范围到达2.0.0.0时,循环并不会停止执行
start_ip = string.split(sys.argv[1], ".")
end_ip = string.split(sys.argv[2], ".")
for c1 in range(int(start_ip[0]), 255):
for c2 in range(int(start_ip[1]), 255):
for c3 in range(int(start_ip[2]), 255):
for c4 in range(int(start_ip[3]), 255):
if "%d.%d.%d.%d" % (c1, c2, c3, c4) == "%d.%d.%d.%d" % (int(end_ip[0]), int(end_ip[1]), int(end_ip[2]), int(end_ip[3])):
break
else:
print "%d.%d.%d.%d" % (c1, c2, c3, c4)
如果有人能告诉我为什么我的代码不正常,或者给我展示一种更好的遍历IP范围的方法,那就太好了。非常感谢大家的帮助。
2 个回答
0
因为一个IP地址只有4个字节,所以它可以用一个32位的整数来表示。这样的话,如果我们能把这个整数和IP地址互相转换,就只需要一个循环来处理了:
# How much is each byte 'worth' in the ip?
units = [1 << (8 * i) for i in range(3, -1, -1)]
def ip_to_int(ip):
return sum(int(byte) * unit for (byte, unit) in zip(ip.split('.'), units))
def int_to_ip(i):
return '.'.join(str((i / bit) & 0xff) for bit in units)
#----------------------
start_ip = "1.0.0.0"
end_ip = "2.0.0.0"
ips = (int_to_ip(i) for i in xrange(ip_to_int(start_ip), ip_to_int(end_ip)))
for ip in ips:
print ip
这样循环起来就简单多了,而且你也可以很方便地判断一个IP地址是否比另一个大或者相等(只需要比较这两个整数就行)。
0
你的循环逻辑有问题。在你用 if
语句比较IP地址的上限时,break
语句只会结束紧挨着的那个循环。
所以它会继续运行整个范围。你需要在每个 for 循环中都加上 break
。可以这样做:
done = False
for c1 in range(int(start_ip[0]), 255):
for c2 in range(int(start_ip[1]), 255):
for c3 in range(int(start_ip[2]), 255):
for c4 in range(int(start_ip[3]), 255):
if "%d.%d.%d.%d" % (c1, c2, c3, c4) == "%d.%d.%d.%d" % (int(end_ip[0]), int(end_ip[1]), int(end_ip[2]), int(end_ip[3])):
done = True
break
else:
print "%d.%d.%d.%d" % (c1, c2, c3, c4)
if(done):
break
if(done):
break
if(done):
break