抓包工具:Wieshak
DHCP服务器功能:动态分配IP地址
服务器:pc
客户机:设备
同时连接在一个局域网里面,服务器为客户机分配IP地址。
一、发现阶段,当客户机和服务器连接在同一个局域网里面后,客户机会发送DHCP_DISCOVER全局广播包,这个时候使用抓包工具
客户机因为没有IP,所以发送的广播源地址为0.0.0.0目的地址为255.255.255.255。网络上的所有支持TCP/IP的主机都会收到该DHCP Discovery报文,但是只有DHCP Server会响应该报文。
服务器的功能就是接收客户机的广播包和发送广播包给客户机
接收:
//创建本地套接口
m_sockRecv.Create(67, SOCK_DGRAM, "192.168.2.55");
//绑定本地套接口
m_sockRecv.Bind(67, "192.168.2.55");
//创建一个定时器定时读取
SetTimer(1, 1000, NULL);
定时器
//接收UDP数据
int iRecv = m_sockRecv.ReceiveFrom(szRecv, 300, szIP, uPort, 0);
PS:szRecv为char的数组,szIP为CString类型的IP地址,uPort为UINT的数字。
关于ReceiveFrom函数:第一个参数为接收客户机传过来的数据,第二个参数为接收数据的缓冲区大小,第三个为发送广播包的IP地址,第四个为发送广播包的端口号,第五个设置为0就行了
通过上面的方法就可以让服务器接收到客户机的DHCP_DISCOVER报文了,根据下图解析报文内容
广播时需要注意的数据变化:
1、op是客户机发送给服务器时为1,反过来服务器发送给客户机为2,
2、ciaddr为客户机IP,这个是在ACK广播时使用,表示真正提供的IP地址。
3、yiaddr为IP地址,OFFER时服务器出租给客户机的IP。
4、
在options的HDCP Message Type中需要注意一个参数:
DHCP_DISCOVER为1
DHCP_OFFER为2
DHCP_REQUEST为3
DHCP_ ACK为5
二、提供阶段
服务器在收到客户机的数据后,需要提供IP地址,提供本网段IP,在提供以前最好PING一下,
发送:
int iSend = m_sockRecv.SendTo(data, 274, 68, "192.168.2.255", 0);
PS:data为char数组,274位发送缓冲区大小,68为客户机端口号,IP地址。 使用同一个套接字,因为客户机还没用IP,所以发送到的IP使用255,全局广播。
提供阶段报文数据开头要改成2,yiaddr区域带上服务器出租给客户机的IP地址,options区域自定义
三、选择阶段
客户机会选择最快回复HDCP服务器广播,并发送DHCP_REQUEST全局广播到所以服务器,表明接收提供的信息,任然使用服务器接收客户机数据。
四、确认阶段
服务器收到DHCP_REQUEST广播后以DHCP_ACK想客户机确认成功,任然是全局广播使用服务器IP发送到255,并在ciaddr添加上IP地址。
PS:
1、pingIP很重要,网段区域的选择要先pingIP然后设置给客户机。(不能ping同的ip才是没有被占用的ip,还需要注意服务器端没有联接网线)
2、接收UDP数据时,如果网络中没有DHCP_DISCOVER,接收会出现死机,套接字最好放在多线程中操作。(注意没有数据就关闭套接字)
未完待续。。。