2014-02-04 2 views
1

Я пытаюсь запросить определенный IP-адрес от DHCP server.Как запросить определенный IP-адрес от DHCP-сервера?

Мое понимание заключается в том, что я должен это сделать, если сервер поддерживает запрос DHCP_REQUESTED_IP в исходном сообщении DHCP_DISCOVER.

Вот код, у меня есть, что не работает:

ip_addr_copy(&dhcp->msg_out->ciaddr , "0xc0a80014"); 
dhcp->msg_out->yiaddr.addr = 0xc0a801e0 ; 

dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); 
dhcp_option_long(dhcp, htonl(0xc0a80176)); 
dhcp_option_long(dhcp, htonl(0xc0a801e0)); 
dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); 
dhcp_option_long(dhcp, htonl(0xc0a80164)); 
dhcp_option_long(dhcp, htonl(0xc0a80101)); 

dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/); 
+0

BusyBox»DHCP-клиент поддерживает эту возможность, и его источником является широко доступным, так что я не понимаю ваш вопрос? – fvu

+0

Мне нужно создать клиентское приложение, которое выполняет вышеупомянутые действия (например, запрос и установка IP-адреса). Я установил параметр DHCP_REQUESTED_IP в коде dhcp, который вы цитируете, но безрезультатно. – user3171859

+0

Сервер не обязан предлагать запрошенный адрес, проверьте [rfc 2131] (http://www.ietf.org/rfc/rfc2131.txt): 'Клиент передает сообщение DHCPDISCOVER в свою локальную физическую подсеть. Сообщение DHCPDISCOVER МОЖЕТ включать параметры, предлагающие значения для сетевого адреса и продолжительности аренды. '. Заметьте, rfc говорит * suggest * – fvu

ответ

1

согласно моему предположению, когда открытие начал dhcp в то время вы запрашиваете IP-адрес. Теперь, например.

При использовании udhcpc(BusyBox:. Udhcp клиент ведет переговоры об аренде с сервером DHCP и уведомляет набор скриптов, когда арендные договоры получают или потеряли) * я обнаружить IP на интерфейсе wlan0, то я пишу первый ниже системы звоните для начала открытия на wlan0

system("udhcpc -i wlan0") 

затем вызвать

GetIpAddress_system(ipaddress);//for getting ip address 

так просто код

char ipaddress[16]; 
system("udhcpc -i wlan0") 
GetIpAddress_system(ipaddress);//for getting ip address 
printf("\nip address:%s",ipaddress); 

источник находкой для GetIpAddress_system() как ниже

static int GetIpAddress_system(char *myIp) 
{ 
    int retVal=0; 
    int size = 1; 
    struct ifreq  *ifr; 
    struct ifconf  ifc; 
    struct sockaddr_in sa; 
    char ip_add[24]={0}; 
    int serversocket;      /* Socket */ 

    #define inaddrr(x) (*(struct in_addr *) &ifr->x[sizeof sa.sin_port]) 
    #define IFRSIZE ((int)(size * sizeof (struct ifreq))) 
    /* Create socket for receiving */ 
    if ((serversocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){ 
     printf("socket() failed");fflush(stdout); 
     return -1; 
    } 
    else 
    { 
     ifc.ifc_len = IFRSIZE; 
     ifc.ifc_req = NULL; 
     do 
     { 
      ++size; 
      /* realloc buffer size until no overflow occurs */ 
      if (NULL == (ifc.ifc_req = realloc(ifc.ifc_req, IFRSIZE))) 
      { 
       retVal= -1; 
       break; 
      } 
      ifc.ifc_len = IFRSIZE; 
      if (ioctl(serversocket, SIOCGIFCONF, &ifc)) 
      { 
       perror("ioctl SIOCFIFCONF"); 
       retVal = -1; 
       break; 
      } 
     }while(IFRSIZE <= ifc.ifc_len); 

     if(0 == retVal) 
     { 
      ifr = ifc.ifc_req; 
      for (;(char *) ifr < (char *) ifc.ifc_req + ifc.ifc_len; ++ifr) 
      { 
       if (ifr->ifr_addr.sa_data == (ifr+1)->ifr_addr.sa_data) 
       { 
        continue; /* duplicate, skip it */ 
       } 
       if (ioctl(serversocket, SIOCGIFFLAGS, ifr)) 
       { 
        continue; /* failed to get flags, skip it */ 
       } 
       if(strcmp(ifr->ifr_name,"wlan0") == 0) 
       { 
        strncpy(ip_add,inet_ntoa(inaddrr(ifr_addr.sa_data)),sizeof(ip_add)); 
        break; 
       } 
      } 
     } 
     close(serversocket); 
    } 

    if(0 == retVal) 
    { 
     printf("%s\n",ip_add); 
     if(myIp) 
     { 
      memset(myIp,0,15); 
      snprintf(myIp,15,"%s",ip_add); 
     } 
     if(ip_add[0]) 
     { 
      return 0; 
     } 
     else 
     { 
      return -1; 
     } 


    } 
    else 
    { 
     return -1; 
    } 
} 
Смежные вопросы