首页 > 技术文章 > 制定ip池内随机生成ip地址

sanghai 2017-01-23 14:31 原文

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]

 

推荐阅读