Как я могу отсортировать весь диапазон доменов от 192.55.22.0 до 192.56.22.0 через python
Я хочу выполнить набор сетевых задач в диапазоне IP-адресов. Как только диапазон становится больше, я не могу перечислить все хосты в диапазоне. Я хочу, чтобы иметь возможность выполнять итерацию через все узлы сети с помощью сетевой маски
Если я передаю какой-либо диапазон от одного к другому, чтобы показать между диапазоном
Ваш пример немного запутан. Что между "192.55.22.0" и "192.56.22.0"? Вы написали "итерацию по всем хостам сети с сетевой маской", но этот диапазон не является полной сетью.
В общем случае для итерации от некоторого 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))
Если у вас есть проблемы при быстром выполнении сетевых операций на таком количестве хостов, посмотрите Pool
в модуле multiprocessing
. Это может ускорить вашу работу, обработав сразу пару хостов.
С чистым 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