抓包发现我的路由器,如果没获取IP,会间隔1.5s发送一次DHCP DISCOVER报文,这个肯定是个BUG
正常的DHCP服务的工作过程如下:
如果在局域网中部署了DHCP服务器,并且客户端设置为自动获得IP地址。这样当DHCP客户端第一次登录网络的时候,也 就是客户端发现本机上没有任何IP数据设定,它会向网络发出一个DHCP discover封包。因为客户端还不知道自己属于哪一个网络,所以封包的来源地址会为 0.0.0.0,而目的地址则为255.255.255.255,然后再附上DHCP discover的信息,向网络进行广播。在windows的预设默认情况下,DHCP discover的等待时间预设为1秒,也就是当客户端将第一个DHCP discover封包送出去之后,在1秒之内没有得到响应的话,就会进行第二次DHCP discover广播。若一直得不到响应的情况下,客户端一共会有四次DHCP discover广播(包括第一次在内)。除了第一次会等待1秒之外,其余三次的等待时间分别是9、13、16秒。如果都没有得到DHCP服务器的响应, 客户端则会显示错误信息,宣告DHCP discover的失败。之后,基于使用者的选择,系统会继续在5分钟之后再重复一次DHCP discover的过程;当DHCP服务器收到DHCP客户机广播的DHCP discover信息后,它会向DHCP客户机发送DHCP offer信息,其中包括一个可租用的IP地址。一旦客户机收到DHCP offer信息,就将使用服务器所提供的IP地址。(http://blog.chinaunix.net/uid-14239467-id-93140.html)那么如何解决呢?
刚开始以为控制DHCP就是在dhcp.c文件里面,但是printf打印却没有相关信息,后来找到了相关文件,是dhcp_port.c文件
刚开始运行的是这个函数,当然可以找到在set_wan.c里面有:
if (wan_type == DHCP_CLIENT) //当为DHCP客户端时候
wandhcpc_startup(wan_interface, dns_mode);
函数注释如下:
__externC int wandhcpc_startup(char *if_name, int dns_mode)
{
diag_printf("enter dhcpc_startup\n");//在串口打印信息里面可以找到这条打印信息
if (wandhcpc_started==1)
{
diag_printf("DHCPC has already been startup\n");//串口里面没有找到这条打印信息
return(-1);