如何遍历IP范围?

2 投票
2 回答
2024 浏览
提问于 2025-04-18 05:20

在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

撰写回答