为了检查IPv4或IPv6地址是否在某个范围内,我有一些代码可以将IPv4地址转换为长整型,并对子网的上限/下限进行相同的转换,然后检查长整型是否介于这些值之间。
我希望能够对IPv6执行相同的操作,但是在Python 2.6标准库中没有发现可供我使用的工具,因此我自己写了这个功能。
我希望能够对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
我的问题是:有没有我所忽略的更简单的方法来做这件事?是否有标准库调用可以帮我完成这个任务?