编写DHCP服务器


抓包工具: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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值