Чтобы проверить, находится ли адрес IPv4 или IPv6 в определенном диапазоне, у меня есть код, который принимает адрес IPv4, превращает его в длинный, а затем выполняет те же преобразования в верхней / нижней границе подсети. , затем проверяет, находится ли long между этими значениями.
Я бы хотел сделать то же самое для IPv6, но в стандартных библиотеках Python 2.6 ничего не увидел, чтобы я мог это сделать, поэтому я написал это:
import socket, struct
from array import array
def ip_address_to_long(address):
ip_as_long = None
try:
ip_as_long = socket.ntohl(struct.unpack('L',
socket.inet_pton(socket.AF_INET, address))[0])
except socket.error:
# try IPv6
try:
addr = array('L', struct.unpack('!4L',
socket.inet_pton(socket.AF_INET6, address)))
addr.reverse()
ip_as_long = sum(addr[i] << (i * 32) for i in range(len(addr)))
except socket.error as se:
raise ValueError('Invalid address')
except Exception as e:
print str(e)
return ip_as_long
Мой вопрос: есть ли более простой способ сделать это, чего мне не хватает? Есть ли стандартный библиотечный вызов, который может сделать это для меня?