DHCP由BOOTP协议发展而来,而后者基于UDP、IP协议,这使得使用socket发送DHCP报文成为可能。本文示例构造了DHCP Discovery报文并调用socket接口发送,值得注意的是,由于DHCP要求发送者ip是0.0.0.0,所以必须使用raw socket进行发送(本文没有示例),更进一步的,用户层代码Linux、macOS系统可以使用libpcap,Windows系统可以使用Windivert、Winpcap/Npcap进行发送。
builder<dhcp_hdr, char[64]> packet;
auto dhcp = packet.get<dhcp_hdr>();
dopt opts[] = {
packet.get<dhcp_opt>(3),
packet.get<dhcp_opt>(9),
packet.get<dhcp_opt>(6),
packet.get<dhcp_opt>(8), // host name
packet.get<dhcp_opt>(10),
packet.get<dhcp_opt>(15)
};
auto optend = packet.get(1);
auto padcalc = calculator<>();
auto padding = packet.get( BOOTP_MIN_LEN - packet.length());
dhcp->opcode = DHCP_REQUEST;
dhcp->htype = ARPHRD_ETHER;
dhcp->hlen = ETHER_ADDR_LEN;
dhcp->hops = 0;
dhcp->xid = 0; // TODO