Перечислите все IP-адреса в диапазоне доменов от 192.55.22.0 до 192.56.22.0 - PullRequest
1 голос
/ 11 июня 2011

Как мне перебрать весь диапазон доменов от 192.55.22.0 до 192.56.22.0 через python
Я хочу выполнить ряд сетевых задач в диапазоне IP-адресов. Как только диапазон увеличивается, я не могу перечислить всех хостов в диапазоне. Я хочу иметь возможность перебирать все хосты сети с маской сети Если я передам любой диапазон от одного к другому, чтобы показать между диапазоном

Ответы [ 2 ]

4 голосов
/ 11 июня 2011

Ваш пример немного сбивает с толку. Что находится между "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. Это может ускорить ваши операции, обрабатывая несколько хостов одновременно.

3 голосов
/ 11 июня 2011

С чистым 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
...