首页 文章

如何从DHCP服务器请求特定的IP地址?

提问于
浏览
1

我正在尝试从DHCP server请求特定的IP地址 .

我的理解是,如果服务器在初始DHCP_DISCOVER消息中支持DHCP_REQUESTED_IP请求,我应该能够这样做 .

这是我的代码不起作用:

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*/);

1 回答

  • 1

    根据我的假设,当您发现 dhcp 时,您需要IP地址 . 现在,例如 .

    如果使用 udhcpc (busybox:The udhcp client negotiates a lease with the DHCP server and notifies a set of scripts when a leases is obtained or lost.)* 我在接口wlan0上发现ip然后我首先写下系统调用以便在 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;
        }
    }
    

相关问题