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

标签 c dhcp

我正在尝试从 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*/);

最佳答案

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

如果使用udhcpc (busybox:udhcp 客户端与DHCP 服务器协商租约,并在获得或丢失租约时通知一组脚本。)* i在接口(interface) 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;
    }
}

关于c - 如何从 DHCP 服务器请求特定的 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552756/

相关文章:

C# - 一个 MAC 地址,多个源 IP 地址

c# - 使用 .NET 检索 Windows DHCP 服务器列表和每个 DHCP 服务器的范围信息

linux - 如何在 Linux 上检测已知无线设备何时加入我的无线局域网

c - 关于整数数据类型和提升

mysql - 将变量值插入mysql表

我可以在 C 中搜索字符串中的字符 (X OR Y) 吗?

不能完全理解 1992 年 Schneier 的这个简单的伪随机生成器

Android DHCP 启用禁用检查

c - 使用 ndisuio 接收 ip 帧

c - 在 C 中读取包含 float 的 .txt 文本文件,以空格分隔