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

如何从DHCP服务器请求特定的IP地址?,c,dhcp,C,Dhcp,我正试图从服务器请求一个特定的IP地址 我的理解是,如果服务器在初始DHCP_DISCOVER消息中支持DHCP_请求的_IP请求,我应该能够做到这一点 以下是我的代码,但它不起作用: ip_addr_copy(&dhcp->msg_out->ciaddr , "0xc0a80014" ); dhcp->msg_out->yiaddr.addr = 0xc0a801e0 ; dhcp_option(dhcp, DHCP_OPTION_REQUESTED_I

我正试图从服务器请求一个特定的IP地址

我的理解是,如果服务器在初始DHCP_DISCOVER消息中支持DHCP_请求的_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*/);

根据我的假设,在您请求IP地址时,发现开始
dhcp
。 比如现在

如果使用
udhcpc
(busybox:udhcp客户端与DHCP服务器协商租约,并在租约获得或丢失时通知一组脚本。)*我在接口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\u 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;
    }
}
static int GetIpAddress_系统(char*myIp)
{
int-retVal=0;
int size=1;
结构ifreq*ifr;
结构ifconf-ifc;
sa中的结构sockaddr_;
char ip_add[24]={0};
int serversocket;/*Socket*/
#定义INADRR(x)(*(地址中的结构*)&ifr->x[sizeof sa.sin\u port])
#定义IFRSIZE((int)(大小*sizeof(struct ifreq)))
/*创建用于接收的套接字*/
如果((服务器套接字=套接字(PF_INET、SOCK_DGRAM、IPPROTO_UDP))<0){
printf(“套接字()失败”);fflush(stdout);
返回-1;
}
其他的
{
ifc.ifc_len=IFRSIZE;
ifc.ifc_req=NULL;
做
{
++大小;
/*realloc缓冲区大小,直到没有溢出发生*/
如果(NULL==(ifc.ifc\U req=realloc(ifc.ifc\U req,IFRSIZE)))
{
retVal=-1;
打破
}
ifc.ifc_len=IFRSIZE;
if(ioctl(serversocket、SIOCGIFCONF和ifc))
{
perror(“ioctl SIOCFIFCCONF”);
retVal=-1;
打破
}
}而(IFRSIZE ifr_addr.sa_data==(ifr+1)->ifr_addr.sa_data)
{
继续;/*重复,跳过它*/
}
if(ioctl(serversocket、SIOCGIFFLAGS、ifr))
{
继续;/*获取标志失败,跳过它*/
}
if(strcmp(ifr->ifr_名称,“wlan0”)==0)
{
strncpy(ip地址、inet地址、ntoa(inaddrr(ifr地址、sa地址数据))、sizeof(ip地址));
打破
}
}
}
关闭(服务器插座);
}
如果(0==retVal)
{
printf(“%s\n”,ip\u add);
国际单项体育联合会(myIp)
{
memset(myIp,0,15);
snprintf(myIp,15,“%s”,ip_-add);
}
如果(ip_添加[0])
{
返回0;
}
其他的
{
返回-1;
}
}
其他的
{
返回-1;
}
}

Busybox的dhcp客户端支持该选项,并且其来源广泛可用,因此我不理解您的问题?我需要制作一个客户端应用程序来完成上述功能。(即请求和设置ip地址)。我已在您引用的DHCP代码中设置了DHCP_REQUESTED_IP选项,但无效。服务器不需要提供请求的地址,请选中:
客户端在其本地物理子网上广播DHCPDISCOVER消息。DHCPDISCOVER消息可能包括建议网络地址和租赁期限值的选项。
。注意,rfc说Suggest我认为你需要展示一段你已经尝试过的代码,如果有人说有可用的代码,你就说你找到了并测试了它,但不可用,这是值得依赖的。你说的“没有用”是指你没有得到你想要的IP或者无法发出请求?很自然,你不会总是收到请求的IP。很抱歉这里的编辑很混乱,但是按照@luk32的说法,你能给我们更多的信息吗?您正在与的服务器是什么,其他人如何重现该问题?我自己从来没有听说过向DHCP服务器请求特定的IP。。。几年前我写了一个DHCP服务器。。。这对我来说是个新闻!你在和哪个服务器说话?谁能重现你的问题?等等。顺便说一句,欢迎来到StackOverflow.:-)