static char *get_ip(const char *ip_pool, char value[256]) { char ip_addr[256+1] = {0}; unsigned mask = 0x0; sscanf(ip_pool, "%[^/]/%d", ip_addr, &mask); long long ip_l = htonl(inet_addr(ip_addr)); for (unsigned i = 31-mask; i < 32; i++) mask = mask | (1 << i); long long min_ip_l = ip_l & (mask & 0xffffffff); long long max_ip_l = ip_l | (~mask & 0xffffffff); ip_l = min_ip_l + rand()%(max_ip_l-min_ip_l+1); struct in_addr addr; addr.s_addr = ntohl(ip_l); strcpy(value, inet_ntoa(addr)); return value; }
# RANDOM_IP_POOL=['192.168.10.222/24'] RANDOM_IP_POOL=['180.3.11.0/24'] 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)))
# 网络字节序到主机字节序的转换 def ip2num(ip): ip = [int(x) for x in ip.split('.')] return ip[0] << 24 | ip[1] << 16 | ip[2] << 8 | ip[3] def num2ip(num): return '%s.%s.%s.%s' % ( (num & 0xff000000) >> 24, (num & 0x00ff0000) >> 16, (num & 0x0000ff00) >> 8, (num & 0x000000ff ) ) def gen_ips(start, end): """生成IP地址""" # if num & 0xff 过滤掉 最后一段为 0 的IP return [num2ip(num) for num in range(start, end + 1) if num & 0xff]