利⽤Python⽣成随机的IP地址
需求
在某应⽤中,需要根据⼀定的规则⽣成随机的IP地址,规则类似于192.168.11.0/24这样的CIDR形式给出。
实现
经过艰苦卓绝的调试,下⾯的代码是可以⽤的:
RANDOM_IP_POOL=['192.168.10.222/0']
def __get_random_ip():
str_ip = RANDOM_IP_POOL[random.randint(0,len(RANDOM_IP_POOL) - 1)]
str_ip_addr = str_ip.split('/')[0]
str_ip_mask = str_ip.split('/')[1]
ip_addr = struct.unpack('>I',socket.inet_aton(str_ip_addr))[0]
mask = 0x0
for i in range(31, 31 - int(str_ip_mask), -1):
mask = mask | ( 1 << i)
ip_addr_min = ip_addr & (mask & 0xffffffff)
ip_addr_max = ip_addr | (~mask & 0xffffffff)
return socket.inet_ntoa(struct.pack('>I', random.randint(ip_addr_min, ip_addr_max)))
⽣成的结果如:
192.168.10.175  192.168.10.29
192.168.10.30    192.168.10.207
192.168.10.248  192.168.10.145
192.168.10.168  192.168.10.223
192.168.10.66    192.168.10.138
192.168.10.99    192.168.10.136
192.168.10.147  192.168.10.244
192.168.10.73    192.168.10.180
random python备注
(mask & 0xffffffff)这⼀⽤法,⽬的在于消除mask上32位以上的⾼位数据。由于mask是IPv4的掩码,所以不需要32位以上的数据。这⼀问题在mask取反之后⽐较明显。由于mask是⼀个32位以上的数(有可能是64位),取反之后,⾼位全部为1,计算的结果就不正确了。因此,在使⽤之前,需要利⽤(mask & 0xffffffff)清除⾼位。
供各位读者参考。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。