如何从DHCP服务器请求特定的IP地址?
我正试图从服务器请求一个特定的IP地址 我的理解是,如果服务器在初始DHCP_DISCOVER消息中支持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_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.:-)