当前位置: 首页 > news >正文

lwip raw、netcoon、socket三种接口编程的区别

目录

一、前言

二、LWIP 简介

三、LWIP RAW 编程

1.概念与原理

2.编程模型与流程

3.示例代码

4.优点与缺点 

四、LWIP NETCONN 编程

1.概念与原理

2.编程模型与流程

3.示例代码

4.优点与缺点 

五、LWIP SOCKET 编程

1.概念与原理

2.编程模型与流程

3.示例代码

4.优点与缺点 

六、三种接口编程的区别总结

1.抽象层次

2.编程难度

3.性能

4.可移植性

5.适用场景

七、总结


一、前言

        在嵌入式网络编程中,LWIP(Lightweight IP)是一个轻量级的 TCP/IP 协议栈,广泛应用于 STM32 等微控制器平台。LWIP 提供了多种编程接口,其中 RAW、NETCONN 和 Socket 是比较常用的三种。本文将详细介绍这三种接口编程的区别,帮助开发者更好地选择适合自己项目的编程方式。

二、LWIP 简介

        LWIP 是一个开源的轻量级 TCP/IP 协议栈,专门为嵌入式系统设计。它具有占用内存少、运行效率高、可移植性强等特点,非常适合在资源有限的微控制器上使用。LWIP 支持多种网络协议,包括 TCP、UDP、IP、ICMP 等,可以满足大多数嵌入式网络应用的需求。

三、LWIP RAW 编程

1.概念与原理

        RAW API 是 LWIP(Lightweight IP)提供的最底层的网络编程接口。它直接基于协议控制块(PCB,Protocol Control Block)进行操作,与 TCP/IP 协议栈的交互最为紧密。例如,对于 TCP 编程,开发者需要直接操作 TCP 的 PCB 来管理连接状态、发送和接收数据等操作。这种方式可以让开发者深入理解协议栈的工作机制,实现对网络通信的精细控制。

2.编程模型与流程

  • 创建连接:以 TCP 为例,通过tcp_new函数创建一个 TCP 协议控制块,然后可以使用tcp_bind函数将其绑定到指定的本地端口,再使用tcp_listen函数使该连接进入监听状态(对于服务器端)。对于客户端,还需要使用tcp_connect函数来建立与服务器的连接。
  • 数据收发:在接收数据方面,需要注册一个接收回调函数,当有数据到达时,LWIP 会调用这个回调函数。在回调函数中,通过操作pbuf(协议缓冲区)来处理接收到的数据。发送数据时,使用tcp_write函数将数据写入发送缓冲区,然后通过tcp_output函数将数据发送出去。
  • 连接关闭:使用tcp_close函数来关闭 TCP 连接,并且通常还需要调用tcp_abort函数在一些异常情况下(如错误处理)强制关闭连接并释放相关资源。

 

3.示例代码

简单的 TCP 服务器接收数据并打印

#include "lwip/tcp.h"
#include "lwip/err.h"
#include <stdio.h>// 定义服务器监听端口
#define SERVER_PORT 8080
// 接收缓冲区大小
#define RX_BUFFER_SIZE 1024// TCP接收回调函数
static err_t tcp_server_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{if (err == ERR_OK && p!= NULL){char buffer[RX_BUFFER_SIZE];int copied_bytes = 0;struct pbuf *q = p;while (q!= NULL){int bytes_to_copy = (q->len < (RX_BUFFER_SIZE - copied_bytes))? q->len : (RX_BUFFER_SIZE - copied_bytes);memcpy(&buffer[copied_bytes], q->payload, bytes_to_copy);copied_bytes += bytes_to_copy;q = q->next;}// 打印接收到的数据printf("Received data: %s", buffer);pbuf_free(p);}else if (err == ERR_OK && p == NULL){// 客户端正常关闭连接}else{// 出现错误,关闭连接tcp_close(tpcb);}return ERR_OK;
}void tcp_server_raw()
{struct tcp_pcb *server_pcb;err_t err;// 创建TCP协议控制块server_pcb = tcp_new();if (server_pcb == NULL){printf("Error creating TCP PCB\n");return;}// 绑定端口err = tcp_bind(server_pcb, IP_ADDR_ANY, SERVER_PORT);if (err!= ERR_OK){printf("Error binding TCP socket: %d\n", err);tcp_close(server_pcb);return;}// 设置为监听状态server_pcb = tcp_listen(server_pcb);if (server_pcb == NULL){printf("Error listening for connections\n");tcp_close(server_pcb);return;}// 设置接收回调函数tcp_recv(server_pcb, tcp_server_recv);
}

4.优点与缺点 

  • 优点
    • 提供了对协议栈的最大控制权限,能够实现高度定制化的网络应用。对于需要深入优化网络性能、实现特殊协议功能或者对资源使用要求极为严格的场景非常有用。
    • 占用资源相对较少,因为没有高层抽象带来的额外开销,代码执行效率可能较高。
  • 缺点
    • 编程难度较大,要求开发者对 TCP/IP 协议栈有深入的理解,需要手动处理很多协议细节,如连接状态管理、缓冲区操作等,代码编写较为复杂,容易出错。
    • 可移植性和代码复用性相对较差,因为 RAW API 与 LWIP 协议栈的耦合度很高,在不同的 LWIP 版本或者其他协议栈环境下可能需要大量修改代码。

四、LWIP NETCONN 编程

1.概念与原理

        NETCONN 是 LWIP 提供的一种介于 RAW API 和 Socket API 之间的中间层次的网络编程接口。它对底层协议细节进行了一定程度的封装,提供了一种相对简单的方式来进行网络连接和数据传输。NETCONN API 基于消息传递机制,通过创建和操作网络连接对象来实现网络通信,隐藏了一些底层的协议控制块操作。

2.编程模型与流程

  • 创建连接:对于 TCP 服务器端,首先使用netconn_new函数创建一个NETCONN_TCP_LISTEN类型的网络连接对象,然后通过netconn_bind函数将其绑定到指定端口,再使用netconn_listen函数使连接进入监听状态。客户端则创建NETCONN_TCP类型的连接对象,并使用netconn_connect函数连接到服务器的 IP 地址和端口。
  • 数据收发:使用netconn_write函数发送数据,该函数会自动处理数据缓冲和发送操作。接收数据时,使用netconn_read函数,它会阻塞当前任务(如果没有数据到达),直到接收到数据或者出现错误。
  • 连接关闭:使用netconn_close函数关闭网络连接,这个函数会自动释放与连接相关的内部资源。

3.示例代码

简单的 TCP 服务器接收数据并打印

#include "lwip/netconn.h"
#include "lwip/err.h"
#include <stdio.h>#define SERVER_PORT 8080
#define RX_BUFFER_SIZE 1024void tcp_server_netconn()
{struct netconn *conn, *newconn;err_t err;char buffer[RX_BUFFER_SIZE];// 创建TCP监听连接conn = netconn_new(NETCONN_TCP);if (conn == NULL){printf("Error creating TCP listen connection\n");return;}// 绑定到指定端口err = netconn_bind(conn, NULL, SERVER_PORT);if (err!= ERR_OK){printf("Error binding TCP connection: %d\n", err);netconn_delete(conn);return;}// 开始监听netconn_listen(conn);while (1){// 接受客户端连接err = netconn_accept(conn, &newconn);if (err == ERR_OK){// 接收客户端数据err = netconn_read(newconn, buffer, sizeof(buffer), -1);if (err == ERR_OK){// 打印接收到的数据printf("Received data: %s", buffer);}// 关闭客户端连接netconn_close(newconn);netconn_delete(newconn);}}// 关闭服务器监听连接netconn_close(conn);netconn_delete(conn);
}

4.优点与缺点 

  • 优点
    • 相对 RAW API 而言,编程难度降低,抽象程度较高,开发者不需要深入了解协议控制块的细节,能够更快速地开发网络应用。它提供了比较方便的接口用于数据收发和连接管理。
    • 代码结构相对清晰,对于简单的网络应用开发效率较高,并且在一定程度上提高了代码的可维护性。
  • 缺点
    • 性能可能不如 RAW API,因为其内部的封装和抽象会带来一定的开销,例如在数据传输过程中可能会涉及更多的缓冲和消息传递操作。
    • 虽然比 RAW API 的可移植性好一些,但仍然与 LWIP 协议栈有一定的依赖关系,在非 LWIP 环境下可能无法使用。

五、LWIP SOCKET 编程

1.概念与原理

        LWIP 中的 Socket 编程是基于 BSD - sockets(Berkeley Sockets)模型实现的。它是一种广泛应用于网络编程的标准接口,提供了一种与操作系统网络接口类似的编程方式。Socket API 在 LWIP 协议栈之上构建了一个高层次的抽象层,使得开发者可以使用熟悉的socketbindlistenacceptsendrecv等函数来进行网络编程,隐藏了 LWIP 协议栈的底层细节。

2.编程模型与流程

  • 创建套接字:使用socket函数创建一个套接字,指定协议族(如AF_INET表示 IPv4)、套接字类型(如SOCK_STREAM表示 TCP,SOCK_DGRAM表示 UDP)和协议(一般为 0,表示使用默认协议)。
  • 绑定与监听(服务器端):对于服务器端,通过bind函数将套接字绑定到特定的 IP 地址和端口号。然后使用listen函数让套接字进入监听状态,等待客户端连接。
  • 连接服务器(客户端):客户端使用connect函数指定服务器的 IP 地址和端口号来建立与服务器的连接(对于 TCP)。对于 UDP,虽然没有连接建立的过程,但也可以使用connect函数指定目标地址,这样后续的sendrecv操作会更方便。
  • 数据收发:使用sendrecv函数(或者它们的变体,如sendtorecvfrom用于 UDP)进行数据的发送和接收。这些函数直接操作底层的套接字,需要开发者更加注意数据的格式、长度和缓冲区管理等细节。
  • 连接关闭:使用close函数关闭套接字,释放相关资源。在关闭之前,需要确保数据已经发送或接收完成,避免数据丢失或连接异常。

3.示例代码

#include "lwip/sockets.h"
#include "lwip/netdb.h"
#include <stdio.h>#define SERVER_PORT 8080
#define RX_BUFFER_SIZE 1024void tcp_server_socket()
{int server_socket, client_socket;struct sockaddr_in server_addr, client_addr;socklen_t client_addr_len;char buffer[RX_BUFFER_SIZE];int bytes_received;// 创建服务器套接字server_socket = socket(AF_INET, SOCK_STREAM, 0);if (server_socket < 0){printf("Error creating server socket\n");return;}// 配置服务器地址结构体server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = htonl(IP_ADDR_ANY);// 绑定套接字到指定端口和IP地址if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){printf("Error binding server socket\n");close(server_socket);return;}// 将套接字设置为监听状态if (listen(server_socket, 5) < 0){printf("Error listening on server socket\n");close(server_socket);return;}while (1){client_addr_len = sizeof(client_addr);// 接受客户端连接client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len);if (client_socket < 0){printf("Error accepting client connection\n");continue;}// 接收客户端数据bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);if (bytes_received > 0){// 打印接收到的数据printf("Received data: %s", buffer);}// 关闭客户端套接字close(client_socket);}// 关闭服务器套接字(正常情况下不会执行到这里)close(server_socket);
}

4.优点与缺点 

  • 优点
    • 编程接口最为通用,与传统的网络编程接口(如 Unix/Linux 下的 Socket 编程)高度相似,对于有网络编程经验的开发者来说非常容易上手。
    • 具有良好的可移植性,在不同的操作系统和网络环境下(只要支持 Socket 接口),代码的改动相对较小。
    • 可以方便地与其他基于 Socket 编程的软件或库进行集成,便于构建复杂的网络应用系统。
  • 缺点
    • 由于其高层次的抽象,可能会损失一些性能,特别是在对性能要求极高的场景下,与 RAW API 相比可能存在差距。
    • 对于 LWIP 协议栈的一些特殊功能或优化可能无法直接利用,因为 Socket API 隐藏了很多底层细节。

六、三种接口编程的区别总结

1.抽象层次

  • RAW API 是最底层的接口,直接操作协议控制块,抽象层次最低。
  • NETCONN API 处于中间层次,对底层协议进行了一定程度的封装,提供了相对简单的网络连接对象操作方式。
  • Socket API 是最高层次的抽象,基于 BSD - sockets 模型,与传统的网络编程接口相似,隐藏了 LWIP 协议栈的底层细节。

2.编程难度

  • RAW API 编程难度最大,需要开发者对 TCP/IP 协议栈有深入的理解,手动处理很多协议细节。
  • NETCONN API 编程难度适中,相对 RAW API 来说,抽象程度较高,开发者不需要深入了解协议控制块的细节。
  • Socket API 编程难度最小,对于有网络编程经验的开发者来说非常容易上手,因为它与传统的网络编程接口相似。

3.性能

  • RAW API 性能可能最高,因为没有高层抽象带来的额外开销,能够实现对协议栈的精细控制。
  • NETCONN API 性能介于 RAW API 和 Socket API 之间,内部的封装和抽象会带来一定的开销。
  • Socket API 性能可能最低,由于高层次的抽象,可能会涉及更多的缓冲和系统调用等操作。

4.可移植性

  • RAW API 可移植性最差,与 LWIP 协议栈的耦合度很高,在不同的 LWIP 版本或者其他协议栈环境下可能需要大量修改代码。
  • NETCONN API 可移植性较好,比 RAW API 更容易在不同的 LWIP 版本之间移植,但仍然与 LWIP 协议栈有一定的依赖关系。
  • Socket API 可移植性最好,与传统的网络编程接口相似,在不同的操作系统和网络环境下(只要支持 Socket 接口),代码的改动相对较小。

5.适用场景

  • RAW API 适用于需要深入优化网络性能、实现特殊协议功能或者对资源使用要求极为严格的场景。
  • NETCONN API 适用于对编程难度有一定要求,但又不想过于深入底层协议细节的场景,例如简单的网络应用开发。
  • Socket API 适用于有网络编程经验的开发者,以及需要与其他基于 Socket 编程的软件或库进行集成的场景。

七、总结

        综上所述,STM32 中 LWIP 的 RAW、NETCONN 和 Socket 三种接口编程各有优缺点,开发者应根据具体的项目需求和自身的编程经验来选择合适的编程方式。如果对性能要求极高,并且有深入了解 TCP/IP 协议栈的能力,可以选择 RAW API;如果希望在一定程度上降低编程难度,同时又不想牺牲太多性能,可以选择 NETCONN API;如果有网络编程经验,并且注重代码的可移植性和通用性,可以选择 Socket API

 

相关文章:

lwip raw、netcoon、socket三种接口编程的区别

目录 一、前言 二、LWIP 简介 三、LWIP RAW 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 四、LWIP NETCONN 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 五、LWIP SOCKET 编程 1.概念与原理 2.编程模型与流程 3.示例代码 …...

在办公室环境中用HMD替代传统显示器的优势

VR头戴式显示器&#xff08;HMD&#xff09;是进入虚拟现实环境的一把钥匙&#xff0c;拥有HMD的您将能够在虚拟现实世界中尽情探索未知领域&#xff0c;正如如今的互联网一样&#xff0c;虚拟现实环境能够为您提供现实中无法实现的或不可能实现的事。随着技术的不断进步&#…...

P3916 图的遍历(Tarjan缩点和反向建边)

P3916 图的遍历 - 洛谷 | 计算机科学教育新生态 写法一&#xff1a;Tarjan 思路&#xff1a;先运用Tarjan算法得到每个连通块中最大的编号&#xff0c;然后对每个连通块进行缩点重新建图&#xff0c;进行dfs&#xff0c;得到缩点后的连通块能够达到的最大编号。 Code: conste…...

Element UI 的 el-tree 组件e中默认展开前两层,设置 default-expanded-keys 属性来实现

在使用 Element UI 的 el-tree 组件时&#xff0c;如果你希望默认展开树的前两层节点&#xff0c;可以通过设置 default-expanded-keys 属性来实现。这个属性接受一个数组&#xff0c;数组中的值是需要默认展开的节点的 key。 首先&#xff0c;你需要确保你的每个树节点都有唯…...

Vue 项目中未登录状态如何统一处理

在 Vue 项目中&#xff0c;处理未登录状态&#xff08;比如用户访问需要登录的页面时&#xff09;是一项常见的需求。为了实现这一需求&#xff0c;我们通常使用 Vue Router 配合 Vuex 或者 Vue 的全局状态管理来统一处理未登录的状态&#xff0c;确保用户只能访问允许的页面。…...

Java 集合:强大的数据管理工具

在 Java 编程中&#xff0c;集合是一种非常重要的工具&#xff0c;它提供了一种方便的方式来存储和操作一组对象。本文将深入探讨 Java 集合框架&#xff0c;包括其主要类型、特点、用法以及一些最佳实践。 一、引言 在软件开发过程中&#xff0c;我们经常需要处理一组数据。…...

Creating Server TCP listening socket *:6379: bind: No error

启动redis报错&#xff1a;Creating Server TCP listening socket *:6379: bind: No error 解决方案&#xff1a; 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown&#xff0c;关闭 3、输exit&#xff0c;退出 4、重新输入 redis-server.exe redis.windows.conf&…...

iOS免费共享企业证书、苹果最新企业证书免费获取

前言 大家可能都注意到了&#xff0c;苹果手机和安卓手机在安装软件上有点不一样。如果你在苹果手机上想装那些没在官方商店&#xff08;App Store&#xff09;里的软件&#xff0c;那就得给它们“签个名”&#xff0c;就像是给它们盖个章&#xff0c;这样手机才能认识它们&am…...

如果用Python写爬虫,具体怎么实现随机请求间隔呢?

在Python中实现随机请求间隔&#xff0c;通常使用time.sleep()函数结合random模块来生成随机的等待时间。以下是一个具体的实现方法&#xff1a; 导入必要的模块 首先&#xff0c;你需要导入time和random模块&#xff1a; import time import random 设置随机间隔 然后&am…...

aws(学习笔记第十五课) 如何从灾难中恢复(recover)

aws(学习笔记第十五课) 如何从灾难中恢复 学习内容&#xff1a; 使用CloudWatch对服务器进行监视与恢复区域(region)&#xff0c;可用区(available zone)和子网(subnet)使用自动扩展(AutoScalingGroup) 1. 使用CloudWatch对服务器进行监视与恢复 整体架构 这里模拟Jenkins Se…...

nginx4层限速

Nginx的功能概述 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也可以作为邮件代理服务器等。它主要工作在7层&#xff08;应用层&#xff09;&#xff0c;但在某些场景下也可以实现部分4层&#xff08;传输层&#xff09;的功能。 关于4层限速 Nginx自身的限制&#x…...

Spring Cloud Alibaba 之 “Feign多参数构造”

在上一篇文章整合好了Feign&#xff0c;现在来总结以下Feign调用多参数方法的使用。 GET方式&#xff1a; Spring Cloud为Feign支持了Spring Mvc注解的。如果请求的是localhost:8083/test?id1&namecoco,那么如果我们这样写&#xff08;User实体类有这二个属性&#xff09…...

C#高级教程

目录 C# 特性&#xff08;Attribute&#xff09;C# 反射&#xff08;Reflection&#xff09;C# 属性&#xff08;Property&#xff09;C# 索引器&#xff08;Indexer&#xff09;C# 委托&#xff08;Delegate&#xff09;C# 事件&#xff08;Event&#xff09;C# 集合&#xf…...

c++ 位图和布隆过滤器

位图&#xff08;bitmap&#xff09; 定义 位图是一种使用位数组存储数据的结构。每一位表示一个状态&#xff0c;通常用于快速判断某个值是否存在&#xff0c;或者用来表示布尔类型的集合。 特点 节省空间&#xff1a;一个字节可以表示8个状态。高效操作&#xff1a;位操作…...

基于Springboot开发的云野旅游平台

一、功能介绍 云野旅游平台包含管理员、用户两个角色以及前后台系统。 前台系统功能 用户登录成功后&#xff0c;可以进行查看旅游路线、最新线路、旅游资讯、个人中心、后台管理、购物车、客服等功能模块。进行相对应操作。 后台系统功能 管理员或用户登录成功后&#xf…...

微服务即时通讯系统(5)用户管理子服务,网关子服务

用户管理子服务&#xff08;user文件&#xff09; 用户管理子服务也是这个项目中的一个业务最多的子服务&#xff0c;接口多&#xff0c;但是主要涉及的数据表只有user表&#xff0c;Redis的键值对和ES的一个搜索引擎&#xff0c;主要功能是对用户的个人信息进行修改管理&#…...

docker.io连接超时的处理,用代理网站

docker pull的时候会超时&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 这时可以找一些代理网站&#xff0c;比如…...

【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用

一、什么是BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简…...

JavaScript 键盘控制移动

如果你想通过 JavaScript 实现键盘控制对象&#xff08;比如一个方块&#xff09;的移动&#xff0c;下面是一个简单的示例&#xff0c;展示如何监听键盘事件并根据按下的键来移动一个元素。 HTML 和 CSS&#xff1a; <!DOCTYPE html> <html lang"en">…...

如何预防服务器后台爆破攻击

服务器后台爆破&#xff08;Brute Force Attack&#xff09;是一种通过反复尝试用户名和密码组合&#xff0c;以非法获取系统访问权限的攻击方式。这种攻击不仅会消耗服务器资源&#xff0c;还可能导致合法用户被锁定或敏感数据泄露。为了有效预防服务器后台爆破攻击&#xff0…...

AI 写作(一):开启创作新纪元(1/10)

一、AI 写作&#xff1a;重塑创作格局 在当今数字化高速发展的时代&#xff0c;AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位&#xff0c;发挥着不可替代的作用。 随着信息的爆炸式增长&#xff0c;人们对于内容的需求日益旺盛。AI 写作能够…...

【HarmonyOS】鸿蒙应用使用lottie动画

【HarmonyOS】鸿蒙应用使用lottie动画 一、lottie动画是什么&#xff1f; https://airbnb.design/lottie Lottie是由Airbnb团队开发的一个适用于iOS、Android、React Native、Web和Windows的开源动画库&#xff0c;用于解析使用Bodymovin导出为JSON的Adobe After Effects动…...

SQL面试题——腾讯SQL面试题 合并连续支付订单

合并连续支付订单 现有一张用户支付表:user_pay包含字段订单ID,用户ID,商户ID,支付时间,支付金额。如果同一用户在同一商户存在多笔订单,且中间该用户没有其他商户的支付记录,则认为是连续订单,请把连续订单进行合并,时间取最早支付时间,金额求和。 +----------+------…...

【docker】10. 容器操作案例

容器操作案例 容器基本操作 • 通过 nginx 镜像文件创建容器 • 容器的列举(包含正在运行的容器) # 发现此时 e7c33d9f5c61 这个容器运行的状态为 Up,即运行状态 rootLAPTOP-H2EI4I6A:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED …...

postman测试

当然&#xff0c;以下是针对你提供的API层和Service层代码中涉及到的各个接口&#xff0c;如何使用 Postman 进行详细测试的指南。这个指南将帮助你理解如何配置 Postman 来测试这些接口&#xff0c;包括请求的构造、认证的处理、以及如何解读响应。 目录 准备工作接口测试指…...

【攻防实验】溯源与取证分析实验

溯源与取证分析实验 溯源取证分析作为网络攻防过程中重要环节&#xff0c;准确找到攻击者的入侵线索(尤其是攻击突破口、攻击IP地址、域名、工具等信息)&#xff0c;对于企业或者团队安全运营团队来说都是必备技能。常规攻击取证过程中往往会结合流量、Web访问日志、终端系统或…...

【测试工具JMeter篇】JMeter性能测试入门级教程(七):JMeter断言

一、前言 在 JMeter 中&#xff0c;断言元件&#xff08;Assertion&#xff09;用于验证测试结果是否符合预期。断言元件可以检查服务器的响应数据&#xff0c;以确保它们符合期望的模式或值&#xff0c;从而验证性能测试脚本的正确性。断言元件通常在每个请求的响应中添加&am…...

Linux 常用命令

目录 一、ls 指令 二、pwd命令 三、cd 指令 1、cd 目录名 2、cd .. 返回上级目录 3、cd ~ 进入用户家目 4、cd - 返回最近访问目录 5、cd相对路径&&cd绝对路径 四、touch指令 五、mkdir指令 1、mkdir 目录名 创建一个目录 2、mkdir -p 递归创建多…...

汽车IVI中控OS Linux driver开发实操(二十八):回声消除echo cancellation和噪声消除Noise reduction

概述: 在当今高度互联的世界中,清晰的实时通信比以往任何时候都更重要。在远程团队会议期间,没有什么能像回声一样打断对话。当说话者听到他们的声音回响时,可能会分散注意力,甚至无法理解对话。即使是很小的回声也会产生很大的影响,仅仅25毫秒的振幅就足以造成声音干扰…...

003-SpringBoot整合Pagehelper

SpringBoot整合Pagehelper 一、引入依赖二、配置 application.yml三、配置 MybatisPlusConfig四、Controller五、ServiceImpl 一、引入依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</ar…...

零基础学安全--shell练习

目录 用shell写一个计算器 测试​ 一些小问题 n阶乘数 测试 拓展 写⼀个Shell脚本去筛选出eth0⽹卡的ipv4地址&#xff0c;并赋值⼀个变量输出 测试 无限重启 用shell写一个计算器 read -p "请输入数字a: " number1 read -p "请输入操作符&#xf…...

【专题】计算机网络之运输层(传输层)

1. 运输层协议概述 1.1 进程之间的通信 (1) 运输层的作用 运输层提供进程间的逻辑通信。 运输层的屏蔽作用&#xff1a; 运输层向高层用户屏蔽了下面网络核心的细节&#xff08;如网络拓扑、所采用的路由选择协议等&#xff09;&#xff0c;使应用进程看见的就是好像在两个运…...

【leetcode100】旋转图像

1、题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],…...

软件工程——期末复习(1)

名词解释&#xff1a; 名词解释--人月 答案&#xff1a;人月是软件开发工作量的单位&#xff0c;1人月表示1个程序员1个月的工作时间所开发的代码量。 请解释软件缺陷、错误和失败&#xff0c;并简单举例说明。 答案&#xff1a;缺陷&#xff08;defect&#xff09;指系统代…...

HTML5系列(3)--多媒体标签详解

前端技术探索系列&#xff1a;HTML5 多媒体标签详解 &#x1f3a5; 开篇寄语 &#x1f44b; 前端开发者们&#xff0c; 在前三篇文章中&#xff0c;我们探讨了 HTML5 的语义化和表单特性。今天&#xff0c;让我们深入了解 HTML5 的多媒体能力&#xff0c;看看如何构建强大的…...

Spring Boot 3.4.0 发布:功能概览与示例

Spring Boot 3.4.0 带来了许多增强功能&#xff0c;使现代应用开发更加高效、便捷和强大。以下是最新功能的完整概述&#xff0c;以及一些帮助您快速入门的代码示例。 1. 应用程序版本管理 Spring Boot 引入了 spring.application.version 属性&#xff0c;方便开发者设置和访…...

【Vue3】【Naive UI】<n-upload>标签

【Vue3】【Naive UI】标签 基本设置 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;n-button&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;a&#xff1e; 标签 【VUE3】【Naive UI】&#xff1c;NDropdown&#xff1e; 标签…...

7.代理模式(Proxy Pattern)

古朗月行 代理模式JDK动态代理代码示例原码分析 cglib动态代理代码示例源码分析 JDK cglib动态代理对比ClassLoader类的生命周期&#xff1a; 参考资料 唐 李白 小时不识月&#xff0c;呼作白玉盘。 又疑瑶台镜&#xff0c;飞在青云端。 仙人垂两足&#xff0c;桂树何团团。…...

【效果】回到顶部功能实现

实现效果&#xff1a; 相关代码&#xff1a; <template><div class"cats" :style"{ top: catsTop }" ref"cats" click"catTop"></div> </template> 样式&#xff1a; /* 回到顶部 - 小猫咪 */ .cats {posi…...

项目搭建+修改

一 : 在列表成功回调函数,追加数据中,添加修改的按钮 for (let x of res) {//追加数据$("#table").append(<tr><td><input type"checkbox" class"ck" value"\${x.uid}"></td><td>\${x.uid}</td>…...

GD库如何根据颜色生成纯色背景图

GD库是一个用于图像处理的PHP扩展模块&#xff0c;它提供了一系列函数来创建、编辑和操作图像。要使用GD库根据颜色生成纯色背景图&#xff0c;可以按照以下步骤进行&#xff1a; 一、检查并安装GD库 检查GD库是否已安装&#xff1a; 可以通过运行phpinfo();或在命令行中使用p…...

Python 网络爬虫入门全知道

一、引言 在当今数字化时代&#xff0c;网络上的数据量呈爆炸式增长。无论是进行数据分析、市场调研&#xff0c;还是开发智能应用&#xff0c;获取网络数据都变得极为重要。而 Python 网络爬虫就是一把打开网络数据宝库的利器。它能够自动地从网页中抓取我们需要的信息&#…...

MATLAB期末复习笔记(下)

目录 五、数据和函数的可视化 1.MATLAB的可视化对象 2.二维图形的绘制 3.图形标识 4.多子图绘图 5.直方图的绘制 &#xff08;1&#xff09;分类 &#xff08;2&#xff09;垂直累计式 &#xff08;3&#xff09;垂直分组式 &#xff08;4&#xff09;水平分组式 &…...

基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)

#1024程序员节&#xff5c;征文# 博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…...

【go】只读通道和只写通道

文章目录 概述1. 通道的方向2. 为什么会有只读通道和只写通道&#xff1f;3. 总结 概述 在 Go 中&#xff0c;只读通道和只写通道的概念通过通道的方向来实现。Go 语言允许你在函数参数中指定通道的方向&#xff0c;从而限制通道的使用方式&#xff0c;这样可以确保代码的清晰…...

带Burst AOT Settings移植问题

报错 burst问题 Burst AOT Settings 是 Unity 的 Burst Compiler 的一部分&#xff0c;用于预编译程序集&#xff08;AOT&#xff0c;Ahead-Of-Time Compilation&#xff09;&#xff0c;以便在不支持 JIT&#xff08;即时编译&#xff09;的平台上运行&#xff0c;例如 iOS 和…...

Debezium日常分享系列之:Debezium Engine

Debezium日常分享系列之&#xff1a;Debezium Engine 依赖打包项目在代码中输出消息格式消息转换消息转换谓词高级记录使用引擎属性异步引擎属性数据库模式历史属性处理故障 Debezium连接器通常通过部署到Kafka Connect服务来运行&#xff0c;并配置一个或多个连接器来监视上游…...

运行 GreatSQL 时为什么要求关闭透明大页

在大部分运维规范中&#xff0c;一般都会要求在运行 GreatSQL/MySQL 的环境中要关闭透明大页&#xff0c;那么到底什么是透明大页&#xff0c;为什么要关闭&#xff0c;打开有什么风险吗&#xff1f; 在此之前&#xff0c;我也是有点懵的&#xff0c;本文试着回答这个疑问&…...

【Rive】Rive在Android上的简单应用

1 前言 Rive 是一款强大的矢量图编辑器&#xff0c;可以设计图形、也可以制作动画。Rive 提供了矩形、圆形、三角形、多边形、星形、钢笔、文字等工具来绘制各式各样的矢量图形&#xff1b;提供了平移、旋转、缩放等工具对矢量图形进行各种变换&#xff1b;提供了骨骼、约束、时…...

Base 崛起,SynFutures 或成生态系统中最具潜力应用

10月份的 Unchained Crypto 采访中&#xff0c;Solana 联合创始人 Anatoly 表示&#xff0c;通过观察活跃地址数、TVL、DeFi 版块、Meme 热潮和开发者生态等多个关键指标&#xff0c;察觉到 Base 势头正猛&#xff0c;成为以太坊生态最强劲的 L2。 11月下旬&#xff0c;小狐狸创…...