编写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,接收会出现死机,套接字最好放在多线程中操作。(注意没有数据就关闭套接字)
未完待续。。。
- 编写DHCP服务器
- DHCP服务器
- dhcp服务器
- DHCP服务器
- DHCP 服务器
- dhcp服务器
- DHCP服务器
- DHCP服务器
- 命令行安装DHCP服务器
- DHCP服务器需求条件
- DHCP服务器的迁移
- 如何建立DHCP服务器
- 如何建立DHCP服务器
- 如何建立DHCP服务器
- 备份DHCP服务器配置
- 路由器模拟DHCP服务器
- DHCP服务器架设指南
- 4.2.6 DHCP服务器
- 编译caffe的一个protobuf问题
- CloudStack中全局变量ha.tag的用法说明
- xfire 创建webservice客户端和服务端
- logback 配置详解(一)
- BZOJ 1951 费马小定理 + Lucas定理 + 乘法逆元 + 中国剩余定理 + 快速幂
- 编写DHCP服务器
- c++ 基础知识(输入输出、namespace命名空间、引用、函数重载模版、内存管理)
- java并发特性: 原子性、有序性、可见性
- SmartFoxServer 2X白皮书
- spring定时任务@Scheduled cron参数配置
- set insert () 1
- 面试准备 -- 程序员面试宝典 -- 重要知识点整理
- 初代
- 蓝桥杯 历届试题 兰顿蚂蚁