网络编程:数据包的封装----libnet库

使用libnet库封装数据包
安装库sudo apt-get install libnet-dev
1、数据包内存初始化
libnet_t *libnet_init(int injection_type, char *device, char *err_buf)
2、构造数据包, 由应用层UDP/TCP到MAC层的顺序构造
封装udp数据包的函数

libnet_ptag_t libnet_build_udp(u_int16_t sp, u_int16_t dp,u_int16_t len, u_int16_t sum,u_int8_t *payload, u_int32_t payload_s,libnet_t *l, libnet_ptag_t ptag)

封装IP数据报的函数

libnet_ptag_t libnet_build_ipv4(u_int16_t ip_len, u_int8_t tos,u_int16_t id, u_int16_t frag,u_int8_t ttl, u_int8_t prot,u_int16 sum, u_int32_t src,u_int32_t dst, u_int8_t *payload,u_int32_t payload_s,libnet_t *l, libnet_ptag_t ptag)

封装mac数据包的函数

libnet_ptag_t libnet_build_ethernet(u_int8_t *dst,u_int8_t *src,u_int16_t type,u_int8_t *payload,u_int32_t payload_s,libnet_t *l,libnet_ptag_t ptag)

3、发送数据

int libnet_write(libnet_t * l)

4、释放资源

void libnet_destroy(libnet_t *l);

代码示例:

#include <libnet.h>
#include <stdio.h>
#include <string.h>int main(int argc, char const *argv[])
{//1. 初始化libnet操作空间libnet_t *net = libnet_init(LIBNET_LINK_ADV, "ens33", NULL);if(net != NULL){printf("libnet init ok\n");// udp报文中的数据unsigned char data[] = "hello, window for libnet!";int datalen = strlen(data) % 2 == 0?strlen(data): strlen(data)+1;//2.构造各层的数据报(从应用层)//2.1 构造udpif(libnet_build_udp(9000, 8000, 8+datalen, 0, data, datalen, net, 0) == -1){printf("build udp fail!\n");goto freenet;}// 2.2 构造IP报文if(libnet_build_ipv4(20+8+datalen, 0, 0, 0, 32, 17, 0,inet_addr("10.35.184.140"),inet_addr("10.35.184.221"), NULL, 0, net, 0) == -1){printf("build ip fail!\n");goto freenet;}//2.3 构造mac报文if(libnet_build_ethernet("4c:e1:73:47:16:3a", "00:0c:29:b0:8f:42", 0x0800, NULL, 0, net, 0) == -1){printf("build ip fail!\n");goto freenet;}// 3 发送数据if(libnet_write(net) != -1){printf("send ok\n");}freenet:// 释放libnet空间libnet_destroy(net);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/43331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Miniconda的常见用法——以Isaacgym为例

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

java中Function、Consumer和Supplier是函数式接口吗?

是的&#xff0c;在Java中&#xff0c;Function、Consumer 和 Supplier 都是函数式接口&#xff0c;它们都是Java 8引入的java.util.function包中的一部分。这些接口为Lambda表达式提供了类型支持&#xff0c;允许以更简洁的方式表示方法引用和匿名内部类。 Function<T, R&g…

SHARPNESS-AWARE MINIMIZATION FOR EFFICIENTLY IMPROVING GENERALIZATION--论文笔记

论文笔记 资料 1.代码地址 https://github.com/google-research/sam https://github.com/davda54/sam 2.论文地址 https://arxiv.org/abs/2010.01412 3.数据集地址 论文摘要的翻译 在当今严重过度参数化的模型中&#xff0c;训练损失的值很难保证模型的泛化能力。事实上…

代码随想录算法训练营第三十天|62.不同路径、63. 不同路径 II

62.不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff…

软设之生成器模式

生成器模式的意图是:将一个复杂的类表示与其构造分离&#xff0c;使得相同的构建过程能够得出不同的表示 Builder:抽象建造者&#xff0c;为创建一个产品对象各个部件指定抽象接口&#xff0c;把产品的生产过程分解为不同的步骤&#xff0c;从而使具体建造者在具体的建造步骤上…

Java中的对象克隆详解

Java中的对象克隆详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 对象克隆在Java编程中是一个重要的概念和技术。它允许我们创建一个对象的精确副本&…

MySQL第三次练习

作业三 一 先创建DB abc&#xff0c;创建table student 1、插入一条记录 2、添加多条记录 3、添加部分记录 4、加0.5 5、删除成绩为空的记录 二 1、创建一个用户test1使他只能本地登录拥有查询student表的权限。 2、查询用户test1的权限。 3、删除用户test1. 全在一张图上…

怎样优化 PostgreSQL 中对日期时间范围的模糊查询?

文章目录 一、问题分析&#xff08;一&#xff09;索引未有效利用&#xff08;二&#xff09;日期时间格式不统一&#xff08;三&#xff09;复杂的查询条件 二、优化策略&#xff08;一&#xff09;使用合适的索引&#xff08;二&#xff09;规范日期时间格式&#xff08;三&a…

AI学习指南机器学习篇-层次聚类(Hierarchical Clustering)简介

AI学习指南机器学习篇-层次聚类(Hierarchical Clustering)简介 在机器学习领域中&#xff0c;层次聚类(Hierarchical Clustering)是一种常见的无监督学习算法&#xff0c;用于将数据集中的样本分成具有相似特征的群组。层次聚类不需要预先指定要分成的群组数目&#xff0c;而是…

逻辑回归模型(非回归问题,而是分类问题)

目录&#xff1a; 一、Sigmoid函数&#xff1a;二、逻辑回归介绍&#xff1a;三、决策边界四、逻辑回归模型训练过程&#xff1a;1.训练目标&#xff1a;2.梯度下降调整参数&#xff1a; 一、Sigmoid函数&#xff1a; Sigmoid函数是构建逻辑回归模型的重要函数&#xff0c;如下…

免费压缩pdf文件大小软件收费吗?pdf如何压缩文件大小?12款压缩应用推荐!

在数字化时代&#xff0c;PDF文件因其跨平台、格式统一的特点而广受欢迎。然而&#xff0c;随着文件内容的增加&#xff0c;PDF文件的大小也逐渐增大&#xff0c;给存储和传输带来了诸多不便。因此&#xff0c;寻找一款合适的PDF压缩软件成为了许多用户的需求。本文将详细介绍1…

单调队列与单调栈(集训day2)

一、目录 1、单调队列 2、单调栈 二、正文 1.单调栈题型&#xff1a; &#xff08;1&#xff09;给出一个数组找出其中每个数左边第一个比它小&#xff08;大&#xff09;的数字 830. 单调栈 - AcWing题库 &#xff08;2&#xff09;求直方图中最大的矩形&…

电子设备常用的胶水有哪些?

目录 1、502胶水 2、703胶水 3、704胶水 4、AB胶 5、红胶 6、Underfill 7、导电胶 8、UV胶 9、热熔胶 10、环氧树脂胶 11、硅酮胶 12、聚氨酯胶 13、丙烯酸胶 14、丁基胶 1、502胶水 502胶水&#xff0c;也被称为瞬间胶或快干胶&#xff0c;是一种非常常见的粘合…

电动卡丁车语音芯片方案选型:让驾驶体验更智能、更安全

在追求速度与激情的电动卡丁车领域&#xff0c;每一次升级都意味着更加极致的驾驶体验。而今天&#xff0c;我们要介绍的&#xff0c;正是一款能够显著提升电动卡丁车智能化与安全性的语音芯片方案——为您的爱车增添一份独特的魅力与安全保障。 智能化升级&#xff0c;从“听…

[Python学习篇] Python面向对象——继承

继承是什么 继承是面向对象编程&#xff08;OOP&#xff09;中的一个核心概念。继承允许一个类&#xff08;称为子类或派生类&#xff09;从另一个类&#xff08;称为父类或基类&#xff09;继承属性和方法。这样可以重用代码&#xff0c;提高代码的模块化和可维护性。 父类&am…

js面试题2024

1.js的数据类型 boolean number string null undefined bigint symbol object 按存储方式分&#xff0c;前面七种为基本数据类型&#xff0c;存储在栈上&#xff0c;object是引用数据类型&#xff0c;存储在堆上&#xff0c;在栈中存储指针 按es标准分&#xff0c;bigint 和sym…

PHP框架讲解 - symfony框架

Symfony 框架概述 Symfony 是一个用于构建 web 应用的 PHP 框架&#xff0c;它遵循 MVC&#xff08;模型-视图-控制器&#xff09;模式&#xff0c;并且具有高度的可定制性。Symfony 是一个组件库&#xff0c;它提供了许多用于构建现代 web 应用的工具和功能。以下是对 Symfon…

布隆过滤器 redis

一.为什么要用到布隆过滤器&#xff1f; 缓存穿透&#xff1a;查询一条不存在的数据&#xff0c;缓存中没有&#xff0c;则每次请求都打到数据库中&#xff0c;导致数据库瞬时请求压力过大&#xff0c;多见于爬虫恶性攻击因为布隆过滤器是二进制的数组&#xff0c;如果使用了它…

FLD工作日志

在FLD的工作日志 一、技能掌握杨总经验的传输 一、技能掌握 06.12 学会如何看小产品的代码&#xff0c;看的消毒灯 07.08 1.学会嘉立创eda 杨总经验的传输 07.07 什么能做就做什么&#xff0c;一刻也不要停不要看不起简单的事情&#xff0c;量变引起质变