|
发表于 2012-4-8 11:31:09
|
显示全部楼层
lwip dhcp server过程
UDP应用编程,发现无法接受到UDP广播报,在网上找了一下,有人说是没有打开接收广播包的状态和。查了一
下资料,加上了这句“”
pcb_dhcps = udp_new();
IP4_ADDR(&broadcast_dhcps,255,255,255,255);
IP4_ADDR(&server_address,192,168,1,1);
IP4_ADDR(&client_address,192,168,1,2);
pcb_dhcps->so_options |= SOF_BROADCAST;
udp_bind(pcb_dhcps, IP_ADDR_ANY, DHCPS_SERVER_PORT );
udp_recv(pcb_dhcps, handle_dhcp, NULL);
调试,依然没有广播包到达。无奈我打开IP,UDP的调试信息输出,发现有如下IP.C文件输出:
ip_input: iphdr->dest 0xffffffff netif->ip_addr 0x 101a8c0 (0x ffffff, 0x 1a8c0, 0xff000000)
ip_input: packet accepted on interface st
ip_input: packet source is not valid.
原来是IP.C文件把这个广播包给丢弃了,修改IP.C文件,使在IP层不丢弃广播包。
再次调试,果然能进入UDP回调函数了。由于我在网上下载的这个DHCP SERVER代码实现比较简单,或者是比较
与之相对应的LWIP版本比较老,有一个重要的结构体定义与我的LWIP不太一样,
struct dhcp_msg *m这个DHCP结构体,少了m-》cookie这一项,但这个比较关键,里面放着uint8_t
magic_cookie[4] = {99, 130, 83, 99};这4个字节,看到这4个字节,才认为这是个DHCP包。而我下载 的这个
版本反这cookie放在了m->option中了,所以在赋值的时候必须往后空用4个字节的空间。还有就是一些编译的
错误了,网上下载 的资料,这少个符号,那多个字母了,很正常的,一般编译器都能把它们找出来,一一更正
就是了。还有就是这个DHCP SERVER自己占用192.168.1.1这个地址,无论谁请求地址,它都给人家一个
192.168.1.2这个地址,搞的第一台电脑连它的时候,就用出现“地址冲突”。于是我把它改成client_addr递
增。增到192.168.1.254,重新给192.168.1.2,也是比较简单。毕竟它不是路由器
DHCP分为4个阶段,discover offer,request ack,
discover发现阶段,客户机向网路上发广播包,问有没没人提供IP地址。
offer提供IP: 服务器向客户端提供的IP地址等信息都 在这个包中。
也许有人认为DHCP在这就可以结束了,但是如果网路 上有多个DHCP服务器,我还是不知道我的电脑到底用的哪
个DHCP服务。所以就有了以下两个包:
request 请求:你想用哪个chdp服务器,向它发送请求,如果对方同意,则它发现下面的包以响应
ACK:同意,欢迎你的加入 。
在这期间,有一个事务ID,x-id,这个ID是由客户端随机生成的,32bit。这个ID贯穿整个4个阶段,我的DHCP
SERVER居然用了一个固定的ID,搞的人家向他发送discover包,它老是回复人家 一个不同ID的offer包,难怪
人家不理他,把这个随机事务ID取出来 ,4 个DHCP阶段,都要用同一个事务ID.
|
|