枚举域范围从192.55.22.0到192.56.22.0的所有IP地址

2024-03-29 15:03:24 发布

您现在位置:Python中文网/ 问答频道 /正文

如何通过python对192.55.22.0到192.56.22.0的所有域进行分类
我想在IP地址范围内执行一组网络任务。一旦范围变大,我就无法枚举范围内的所有主机。我想用网络掩码遍历网络的所有主机 如果我从一个射程到另一个射程来显示射程


Tags: 网络分类掩码射程
2条回答

你的例子有点令人困惑。“192.55.22.0”和“192.56.22.0”之间是什么?您曾写过“使用网络掩码遍历网络的所有主机”,但该范围不是一个完整的网络。在

在一般情况下,要从某个ip迭代到另一个ip,可以使用:

def ip_atoi(ip):
    return struct.unpack('!I', socket.inet_aton(ip))[0]
def ip_itoa(ip):
    return socket.inet_ntoa(struct.pack('!I', ip))

current = ip_atoi('192.55.22.0')
end = ip_atoi('192.56.22.0')

for ip in xrange(current, end):
    do_something_on(ip_itoa(ip))

如果在这么多主机上快速执行网络操作时遇到问题,请查看multiprocessing模块中的Pool。它可以通过同时处理几个主机来加快操作速度。在

使用纯Python(和IPv6支持):

import socket,struct

# In Python 3+, you can simply use range
# In Python 2, you can substitute xrange if you're only dealing with IPv4
def _range(a, b):
    while a<b:
        yield a
        a+=1

def addrRange(start,end,fam=socket.AF_INET):
    famFmt = '!I' if fam == socket.AF_INET else '!Q'
    addr2int = lambda a: struct.unpack(famFmt, socket.inet_pton(fam, a))[0]

    for ai in _range(addr2int(start), addr2int(end)+1):
        yield socket.inet_ntop(fam, struct.pack(famFmt, ai))

for a in addrRange('192.55.22.0', '192.56.22.0'):
    print(a) # Or do something with the address

相关问题 更多 >