C++构造DHCP Discovery报文并使用socket发送

2023-05-16

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: Transaction ID
	dhcp->secs       = 0;
	dhcp->flags      = 0; // UNICAST
	dhcp->cip        = IP_THIS_ADDR;
	dhcp->yip        = IP_THIS_ADDR;
	dhcp->sip        = IP_THIS_ADDR;
	dhcp->gip        = IP_THIS_ADDR;
	memcpy(dhcp->chaddr, ETHER_SELF_MAC, ETHER_ADDR_LEN);
	memset(&dhcp->chaddr[ETHER_ADDR_LEN], 0, sizeof(dhcp_hdr::chaddr) - ETHER_ADDR_LEN);
	memset(dhcp->sname, 0, sizeof(dhcp_hdr::sname));
	memset(dhcp->file, 0, sizeof(dhcp_hdr::file));
	dhcp->magic      = BOOTP_RMAGIC;
	opts[0]->kind    = DHCP_MESSAGETYPE;
	opts[0]->len     = 1;
	opts[0]->val[0]  = DHCP_MSGDISCOVER;
	opts[1]->kind    = DHCP_CLIENTID;
	opts[1]->len     = 7;
	opts[1]->val[0]  = ARPHRD_ETHER; // hardware address
	memcpy(&opts[1]->val[1], ETHER_SELF_MAC, ETHER_ADDR_LEN);
	opts[2]->kind    = DHCP_DISCOVERADDR;
	opts[2]->len     = IPV4_ADDR_LEN;
	memcpy(opts[2]->val, "\x00\x00\x00\x00", opts[2]->len);
	opts[3]->kind    = DHCP_HOSTNAME;
	opts[3]->len     = sizeof("Huawei") - 1;
	memcpy(opts[3]->val, "Huawei", opts[3]->len);
	opts[4]->kind    = DHCP_CLASSSID;
	opts[4]->len     = sizeof("MSFT 5.0") - 1;
	memcpy(opts[4]->val, "MSFT 5.0", opts[4]->len);
	opts[5]->kind    = DHCP_PARAMREQUEST;
	opts[5]->len     = 13;
	opts[5]->val[0]  = DHCP_SUBNETMASK;
	opts[5]->val[1]  = DHCP_ROUTER;
	opts[5]->val[2]  = DHCP_DNS;
	opts[5]->val[3]  = DHCP_DOMAINNAME;
	opts[5]->val[4]  = DHCP_DOROUTEDISC;
	opts[5]->val[5]  = DHCP_STATICROUTE;
	opts[5]->val[6]  = DHCP_VENDSPECIFIC;
	opts[5]->val[7]  = DHCP_NBNS;
	opts[5]->val[8]  = DHCP_NBTCPIP;
	opts[5]->val[9]  = DHCP_NBTCPSCOPE;
	opts[5]->val[10] = DHCP_CLSTATICROUTE;
	opts[5]->val[11] = DHCP_MSCLSTATICROUTE;
	opts[5]->val[12] = DHCP_PRIAUTODISCOVERY;
	optend[0]        = DHCP_END;

	ManagedObject<Sockets> sock = new Sockets(IPPROTO_UDP, SOCK_DGRAM);
	sock->SetOption(SO_BROADCAST, 1);
	sock->SendTo(packet.first<void>(), packet.length<int>(), IP_BCAST_ADDR, DHCP_BOOTPS_RPORT);


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++构造DHCP Discovery报文并使用socket发送 的相关文章

  • Red Hat 服务配置实验day02

    day02 1 再配置两台相同环境的 分别取名为client1 client2 细节不说了 克隆不克隆随你 mac别一样就行 2 配置网卡 sever client1 client2 配置相同的虚拟网卡 别选0 1 8 这三个一般别的nat
  • 如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6

    如何实现在一个 Socket 应用程序中同时支持 IPv4 和 IPv6 如何巧妙地设计代码结构 陈 鲁 软件工程师 IBM 孙 妍 软件工程师 IBM 简介 当今的网络主流是 IPv4 网络 但随着 IP 地址的日益短缺 IPv6 网络开
  • select 模型解释

    套接字模式 阻塞套接字和非阻塞套接字 或者叫同步套接字和异步套接字 套接字模型 描述如何对套接字的I O行为进行管理 Winsock提供的I O模型一共有五种 select WSAAsyncSelect WSAEventSelect Ove
  • 物联网实训总结——简易的智能农场

    物联网实训总结 简易的智能农场 一 场景需求 1 农场环境监测 对农场的环境实现智能感知 对温度 湿度 光照值实时显示 同时检测农场烟雾状态 判断火情 实时监控农场人员出现情况 2 控制管理 智能农场控制部分分为 通风系统和补光系统 实现对
  • 【转】QT中QWS的含义

    QT编程和文档中的术语QWS的全称是Qt windows system 是QT自行开发的窗口系统 体系结构类似X Windows 是一个C S结构 由QWS Server在物理设备上显示 由QWS Client实现界面 两者通过socket
  • IOS 网络初探(一) - NSURLConnection

    在IOS中 除了最基本的socket外 苹果提供了NSURLConnection类来实现网络通信 请求服务器数据 GET方式 请求服务器数据分成异步和同步两种方式 先来看看异步 非阻塞 NSURL url NSURL URLWithStri
  • 通过socket获取对方ip地址

    struct sockaddr in sa int len sizeof sa if getpeername sockfd struct sockaddr sa len printf 对方IP s inet ntoa sa sin addr
  • Java swing + socket 写的一个五子棋网络对战游戏

    自从开始接触Swing以来 就喜欢写写各种管理系统 写多了就萌生了一种类似于实时在线对战的游戏 经过一番构思后就开始着手设计这个网络对战版本的五子棋了 游戏代码包含两部分 常规的C S模式 C代表客户端 S代表服务端 下载代码后先启动服务器
  • 使用Java socket简单模拟HTTP服务器

    1 HTTP server 接收client端的http请求并将同级目录的root 返回 package httpDemo import java io InputStream import java io OutputStream imp
  • 几种获取本机IPv6地址的方法

    如同获取IPv4的地址一般 获取IPv6也是可以通过使用网卡信息来得到IPv6的地址 也可以给一个多播地址发送数据包然后获取IPv6的地址 在IPv4通过iotcl函数是可以获取本主机的IPv4的地址的 但是本楼主使用iotcl函数来获取I
  • Windows 2012 DHCP超级作用域的一个坑

    今天在将Cisco交换机DHCP服务改为Windows2012服务器DHCP服务的过程中 发现一个奇怪的现象 环境 Cisco2960S交换机上划分有多个VLAN interface Vlan3 ipaddress 10 86 24 1 2
  • TCP/IP编程实现远程文件传输

    TCP IP编程实现远程文件传输 在TCP IP网络结构中 为了保证网络安全 网络人员往往需要在路由器上添加防火墙 禁止非法用户用ftp等安全危害较大的TCP IP协议访问主机 而有时系统维护人员需要用ftp将一些文件从中心机房主机传到前端
  • socket,socket.io,mongodb

    Socket 网络上的程序实现双向的数据链接 这个链接的一端成为socket 1 Socket是一个持久链接 2 Socket是双向通信的 Socket VS ajax轮询 ajax轮询 是利用客户端来发送请求 每隔几秒发送一个http请求
  • c#Socket 异步通讯(客户端与服务端)

    c Socket 异步通讯 多个客户端与服务端 最近公司有个项目 涉及到的通讯对象有点多 就拿其中一个库的通讯来说就用到了3个PLC 这里就涉及了一个服务器与多个客户端之间的通讯了 同时上位机既需要做客户端 也需要做服务端 因为跟PLC之间
  • golang之跨语言ipc通信

    1 golang之跨语言ipc通信 文章目录 1 golang之跨语言ipc通信 1 1 unix domain Socket unix域套接字 介绍 1 2 IPC SOCKET通信 1 2 1 函数及地址定义介绍 1 2 2 UNIX
  • 【Linux 应用】网络相关开发---ip、网关、掩码、dns、mac的获取和设置,以及dhcp动态获取

    最近开始调试Linux 的测试版 需要开发网络设置相关功能 其实这一块以前也做过 但是都忘记了 可见沉淀的重要性 1 ip 掩码设置和获取 通过int ioctl int d int request 这个函数可以获取到 其中 IP设置 SI
  • 【安装篇】- 基于 VMWARE Oracle Linux7.9 安装 Oracle19c RAC 详细配置方案

    作者 yanwei 来源 墨天轮 https www modb pro db 95684 大家好 我是 JiekeXu 很高兴又和大家见面了 今天和大家一起来看看 Linux7 9 安装 Oracle19c RAC 详细配置方案 欢迎点击上
  • 实现 DHCP 客户端

    在使用 C 的 UNIX 上 我的客户端正在以超级用户模式侦听端口 68 发送 DHCP 发现消息后 当我尝试接收时 它会阻塞在 recvfrom 中 这意味着没有收到消息 或者系统是否有一个进程 DHCP 客户端 在同一端口 68 上监听
  • 网络基础设施发现

    我想执行彻底的 LAN 设备发现 以便我可以创建一个与所附图表类似的图表 但包含 IP 和 MAC 地址等附加信息 我尝试过 Torry 的代码 type PNetResourceArray TNetResourceArray TNetRe
  • 使用 python scapy 发送 DHCP Discover

    我是Python新手 正在学习一些网络编程 我希望通过我的tap接口向我的DHCP服务器发送一个DHCP数据包 并期待它的一些响应 我尝试了几种数据包构建技术 例如 structs 和 ctypes 最终使用 scapy 在这里 我能够发送

随机推荐

  • 【电路】PT1000/PT100温度采集电路

    目录 原理图下载链接 xff1a https download csdn net download Roger 717 33823983https download csdn net download Roger 717 33823983h
  • 【QT】手把手制作一个QT网络调试助手(准备阶段)

    目录 1 新建一个工程 2 mainwindow ui设计 2 1 对窗口主体进行栅格化布局 2 2 添加网络通信配置GroupBox 2 2 1 填充内容 2 2 2 栅格布局GroupBox 2 3 总结 3 Pro程序配置 4 头文件
  • 【PR】PR视频剪辑实用技巧

    1 两个视频叠加 1 首先 xff0c 找到要导入的视频所在文件夹 xff0c 将视频拖动到项目面板中 按住Ctrl拖动视频再复制两个视频 2 将素材视频分别拖入到序列的 视频轨道1 2 3 3 点击选中轨道1上的视频 xff0c 在源面板
  • 【Project】项目管理软件学习笔记

    一 前言 使用Project制定项目计划步骤大致如下 xff1a 以Project2013为例 xff0c 按照上图步骤指定项目计划 二 实施 2 1 创建空白项目 点击文件 新建 空白项目 xff0c 即完成了空白项目的创建 xff0c
  • 【硬件】P沟道和N沟道MOS管开关电路设计

    场效应管做的开关电路一般分为两种 xff0c 一种是N沟道 xff0c 另一种是P沟道 xff0c 如果电路设计中要应用到高端驱动 的话 xff0c 可以采用PMOS来导通 P沟道MOS管开关电路 PMOS的特性 xff0c Vgs小于一定
  • 多线程基础之七:多线程遇上printf的“延迟写”策略

    0 运行库提供的IO读写函数采用 延迟写 策略的原因 编程时经常会用到printf 函数 xff0c 但是由于printf 函数涉及到和显示器或磁盘等外设进行交互 xff0c 所以操作涉及到从 用户态 gt 内核态 gt 返回用户态 的一系
  • VC和VS区别

    S是Visual Studio xff0c 它是微软提供的一个工具集 xff0c 由各种各样的工具组成 VS可以支持C C 43 43 VB JAVA C 编程 然了一次只能支持一种编程方式 在VS安装完成 xff0c 第一次运行的时候会让
  • 【potplayer安装及设置LAV Splitter】

    potplayer安装及设置LAV Splitter 下载及安装Lav Splitter解码器配置Lav Splitter解码器 potplayer是一款windows平台上一款轻量功能强大的播放器 xff0c 它界面简洁 xff0c 功能
  • 关于头文件的相互包含

    编程过程中 xff0c 经常会碰到头文件的相互包含 xff0c 如果处理不慎 xff0c 就会报错 比如在头文件A h中有如下代码 xff08 代码中的B Handle是在头文件B h中定义的 xff09 xff1a span class
  • Python list中去重的多种方法

    去重之后顺序会改变 set去重 列表去重会让列表改变原来的顺序 l1 61 1 4 4 2 3 4 5 6 1 l2 61 list set l1 print l2 1 2 3 4 5 6 但是 xff0c 可以通过列表中索引 xff08
  • TI学习笔记之“振动补偿算法”

    一些应用中 xff0c 负载和机械角度有关 xff0c 比如空调压缩机 典型压缩机应用的负载曲线如下图所示 xff0c 不难发现 xff0c 在一个机械周期内 xff0c 负载和机械角度存在一定的关系 xff0c 这种情况在转子式压缩机中尤
  • “compilerPath“的问题

    在c cpp properties josn文件中 xff0c complierPath的问题解决如下 如果正在编译c 43 43 文件 xff0c 先在终端输入which g 43 43 我的弹出了 usr bin g 43 43 把这个
  • Digest Authentication Response 如何计算

    Session Initiation Protocol NOTIFY Request Line NOTIFY sip 192 168 125 130 5060 SIP 2 0 Method NOTIFY Request URI sip 19
  • ROS-Melodic 编译Moveit全过程记录和错误解决方案

    ROS Melodic 编译Moveit全过程记录和错误解决方案 在Ros Melodic版本下 xff0c 直接运行sudo apt get install ros melodic moveit会出现以下错误 xff1a 下列软件包有未满
  • Jetson TX2在ROS下使用Realsense D435i跑rtabmap、octomap、VINS-Mono和ORB-SLAM2

    使用环境 xff1a Ubuntu 16 04 JetPack 3 3 xff0c ROS Kinetic硬件设备 xff1a 英伟达Jetson TX2 xff0c 英特尔Realsense D435i 安装Realsense相关的相机驱
  • C++实现流式socket聊天程序

    目录 协议设计 消息的类型 消息的语法 消息的语义 消息的处理 发送消息 接收消息 程序设计 模块的划分和功能 Client客户端 Server服务器 模块流程图 程序实现 辅助代码 client cpp server cpp 程序测试 本
  • STM32 串口 FIFO

    使用FIFO实现串口数据的收发功能 FIFO的相关实现参照链接 xff1a CSDN https mp csdn net mp blog creation editor 120448361 1 Cubemx串口配置 使用Cubmx对串口进行
  • C Primer Plus

    C Primer Plus作为一本被人推崇备至的c入门经典 xff0c C primer plus绝非浪得虚名 应该算得上C教材里最好的入门书了 在知识广度上 xff0c 很少有书能匹及 它能为你系统学习c提供一个良好的平台 作者对c的见解
  • Python 如何处理大文件

    Python作为一门程序设计语言 xff0c 在易读 易维护方面有独特优势 xff0c 越来越多的人使用 Python 进行数据分析和处理 xff0c 而 Pandas 正是为了解决数据分析任务而创建的 xff0c 其包含大量能便捷处理数据
  • C++构造DHCP Discovery报文并使用socket发送

    DHCP由BOOTP协议发展而来 xff0c 而后者基于UDP IP协议 xff0c 这使得使用socket发送DHCP报文成为可能 本文示例构造了DHCP Discovery报文并调用socket接口发送 xff0c 值得注意的是 xff