编写DHCP服务器

来源:互联网 发布:asic和单片机 编辑:程序博客网 时间:2024/06/05 19:30


抓包工具: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,接收会出现死机,套接字最好放在多线程中操作。(注意没有数据就关闭套接字)

未完待续。。。

0 0
原创粉丝点击