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

Linux下编译 libwebsockets简介和使用示例

目录

1:简单介绍:

2:项目地址

3:编译

3.1:集成介绍

3.2:编译

4:客户端服务端示例:

4.1 客户端示例

4.2 服务端示例:


1:简单介绍:

    Linux下编译libwebsockets和使用简单示例,给需要的各位参考

          libwebsockets是一个小巧强大的库,它使用 C 语言编写,可以帮助开发者轻松实现 WebSocket 协议。WebSocket 是一种网络通信协议,它允许服务器和客户端之间建立一个持久的连接,这样双方就可以实时地发送和接收消息了。

优点

  1. 轻量级和高效:libwebsockets 设计为轻量级,适合嵌入式系统和资源受限的环境,能够高效地处理 WebSocket 和 HTTP 请求。
  2. 双向通信:支持全双工通信,允许服务器主动推送数据到客户端,减少了延迟。
  3. 较少的通信开销:相比于传统的 HTTP 协议,WebSocket 的通信开销较小,因为它在建立连接后可以持续使用同一连接进行数据交换。
  4. 多协议支持:除了 WebSocket,libwebsockets 还支持 HTTP/1、HTTP/2、MQTT 等多种协议,具有良好的扩展性。
  5. 安全性:内建对 SSL/TLS 的支持,能够实现安全的通信

缺点

  1. 复杂性:libwebsockets 的接口较底层,许多逻辑需要开发者自行封装实现,这可能增加开发的复杂性。
  2. 线程安全性:该库不是线程安全的,因此在多线程环境中使用时需要特别注意线程和锁的管理。
  3. 兼容性问题:虽然大多数现代浏览器支持 WebSocket,但在一些旧版浏览器中可能存在兼容性问题。
  4. 重连机制:WebSocket 需要处理网络不稳定时的重连问题,这在某些情况下可能会导致实现上的复杂性。

2:项目地址

这里有几个不同的地址,防止有些网络问题获取不到

github地址:

warmcat/libwebsockets: canonical libwebsockets.org networking libraryicon-default.png?t=O83Ahttps://github.com/warmcat/libwebsocketsgitcode地址:GitCode - 全球开发者的开源社区,开源代码托管平台icon-default.png?t=O83Ahttps://gitcode.com/gh_mirrors/li/libwebsockets/overview?utm_source=csdn_blog_hover&isLogin=1

示例项目地址:

GitHub - iamscottmoyers/simple-libwebsockets-example: Simple libwebsockets ExampleSimple libwebsockets Example. Contribute to iamscottmoyers/simple-libwebsockets-example development by creating an account on GitHub.icon-default.png?t=O83Ahttps://github.com/iamscottmoyers/simple-libwebsockets-example/blob/master

3:编译

3.1:集成介绍


     在 libwebsockets 的顶层 CMakeLists.txt 文件中,看到许多选项来启用或禁用不同的功能、示例和应用程序。以下是一些关键的部分根据需要启用或禁用它们来减少编译时间:

功能选项

LWS_WITH_STATIC  编译静态库
LWS_WITH_SHARED 编译动态库
LWS_WITH_DISTRO_RECOMMENDED: 启用推荐的功能集,适用于发行版包装。
LWS_WITH_SSL: 启用 SSL 支持。
LWS_WITH_HTTP2: 启用 HTTP/2 支持。
LWS_WITH_ZLIB: 启用 zlib 支持。
LWS_WITH_LIBEVENT: 启用 libevent 支持。
LWS_WITH_PLUGINS: 启用插件支持。

客户端/服务器/测试应用程序
LWS_WITHOUT_CLIENT: 不构建客户端部分。
LWS_WITHOUT_SERVER: 不构建服务器部分。
LWS_WITHOUT_TESTAPPS: 不构建测试应用程序。
LWS_WITHOUT_TEST_SERVER: 不构建测试服务器。
LWS_WITHOUT_TEST_PING: 不构建 ping 测试应用程序。
LWS_WITHOUT_TEST_CLIENT: 不构建客户端测试应用程序。

示例
LWS_WITH_MINIMAL_EXAMPLES: 构建最小化的示例。
LWS_WITH_LWSWS: 构建 libwebsockets Web 服务器示例。

特定平台
LWS_WITH_ESP32: 为 ESP32 构建。
LWS_PLAT_OPTEE: 为 OPTEE 构建。
LWS_PLAT_FREERTOS: 为 FreeRTOS 构建。
LWS_PLAT_ANDROID: Android 平台。
LWS_PLAT_BAREMETAL: 为裸机构建。
其他
LWS_WITH_SELFTESTS: 启用自测试。
LWS_WITH_EXPORT_LWSTARGETS: 导出 CMake 目标。

3.2:编译

1.创建build 存放编译文件,libwebsockets没有makeclean,重新编译时,清空build就行
2.创建out 存放生成的库文件

3.注意你的DCMAKE_CXX_COMPILER和DCMAKE_CXX_COMPILER必须是需要使用绝对路径

4.关闭ssl、libevent相关,关闭示例编译,如果你需要libevent或者ssl相关,你需要先编译这些依赖后再编译libwebsocket
5.设置编译系统为linux 

6.生成动态和静态库两种类型

# mkdir build
# mkdir out# cmake ../ -DCMAKE_C_COMPILER=/你的全路径xxx/xx-linux-gcc \-DCMAKE_CXX_COMPILER=/你的全路径xxx/xx-linux-g++ \-DLWS_WITH_STATIC=ON  \-DLWS_WITH_SHARED=ON   \-DCMAKE_INSTALL_PREFIX=/你的路径xxx/output \-DLWS_WITH_MINIMAL_EXAMPLES=OFF \-DLWS_STATIC_PIC=ON \-DLWS_WITHOUT_TESTAPPS=ON \-DCMAKE_SYSTEM_NAME=Linux \-DLWS_WITH_SSL=OFF# make
# make install

cmake其他参数 :

-DCMAKE_SYSTEM_NAME                 指定系统为Linux
-DCMAKE_C_COMPILER                   需要使用绝对路径
-DCMAKE_CXX_COMPILER                 c++编译器
-DLWS_OPENSSL_INCLUDE_DIRS           Openssl头文件目录位置
-DLWS_OPENSSL_LIBRARIES              Openssl动态库位置
-DLIBEVENT_INCLUDE_DIRS              libevent头文件目录位置
-DLIBEVENT_LIBRARIES                 libevent动态链接库位置

编译后 会在out路径下生成对应的bin、lib、include

4:客户端服务端示例:

示例是github上的开源示例,可能有些朋友会因为网络问题 看不到,我这里粘贴出来,给各位参考,项目地址为:

iamscottmoyers/simple-libwebsockets-example: Simple libwebsockets Exampleicon-default.png?t=O83Ahttps://github.com/iamscottmoyers/simple-libwebsockets-example/tree/master

4.1 客户端示例
#include <libwebsockets.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>static struct lws *web_socket = NULL;#define EXAMPLE_TX_BUFFER_BYTES 10static int callback_example( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len )
{switch( reason ){case LWS_CALLBACK_CLIENT_ESTABLISHED:lws_callback_on_writable( wsi );break;case LWS_CALLBACK_CLIENT_RECEIVE:/* Handle incomming messages here. */break;case LWS_CALLBACK_CLIENT_WRITEABLE:{unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + EXAMPLE_TX_BUFFER_BYTES + LWS_SEND_BUFFER_POST_PADDING];unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];size_t n = sprintf( (char *)p, "%u", rand() );lws_write( wsi, p, n, LWS_WRITE_TEXT );break;}case LWS_CALLBACK_CLIENT_CLOSED:case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:web_socket = NULL;break;default:break;}return 0;
}enum protocols
{PROTOCOL_EXAMPLE = 0,PROTOCOL_COUNT
};static struct lws_protocols protocols[] =
{{.name                  = "example-protocol", /* Protocol name*/.callback              = callback_example,   /* Protocol callback */.per_session_data_size = 0,                  /* Protocol callback 'userdata' size */.rx_buffer_size        = 0,                  /* Receve buffer size (0 = no restriction) */.id                    = 0,                  /* Protocol Id (version) (optional) */.user                  = NULL,               /* 'User data' ptr, to access in 'protocol callback */.tx_packet_size        = 0                   /* Transmission buffer size restriction (0 = no restriction) */},LWS_PROTOCOL_LIST_TERM /* terminator */
};int main( int argc, char *argv[] )
{struct lws_context_creation_info info;memset( &info, 0, sizeof(info) );info.port = CONTEXT_PORT_NO_LISTEN; /* we do not run any server */info.protocols = protocols;info.gid = -1;info.uid = -1;struct lws_context *context = lws_create_context( &info );time_t old = 0;while( 1 ){struct timeval tv;gettimeofday( &tv, NULL );/* Connect if we are not connected to the server. */if( !web_socket && tv.tv_sec != old ){struct lws_client_connect_info ccinfo;memset(&ccinfo, 0, sizeof(ccinfo));ccinfo.context = context;ccinfo.address = "localhost";ccinfo.port = 8000;ccinfo.path = "/";ccinfo.host = lws_canonical_hostname( context );ccinfo.origin = "origin";ccinfo.protocol = protocols[PROTOCOL_EXAMPLE].name;web_socket = lws_client_connect_via_info(&ccinfo);}if( tv.tv_sec != old ){/* Send a random number to the server every second. */lws_callback_on_writable( web_socket );old = tv.tv_sec;}lws_service( context, /* timeout_ms = */ 250 ); /* NOTE: since v3.2, timeout_ms may be set to '0', since it internally ignored */}lws_context_destroy( context );return 0;
}
4.2 服务端示例:
#include <libwebsockets.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>static struct lws *web_socket = NULL;#define EXAMPLE_TX_BUFFER_BYTES 10static int callback_example( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len )
{switch( reason ){case LWS_CALLBACK_CLIENT_ESTABLISHED:lws_callback_on_writable( wsi );break;case LWS_CALLBACK_CLIENT_RECEIVE:/* Handle incomming messages here. */break;case LWS_CALLBACK_CLIENT_WRITEABLE:{unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + EXAMPLE_TX_BUFFER_BYTES + LWS_SEND_BUFFER_POST_PADDING];unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING];size_t n = sprintf( (char *)p, "%u", rand() );lws_write( wsi, p, n, LWS_WRITE_TEXT );break;}case LWS_CALLBACK_CLIENT_CLOSED:case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:web_socket = NULL;break;default:break;}return 0;
}enum protocols
{PROTOCOL_EXAMPLE = 0,PROTOCOL_COUNT
};static struct lws_protocols protocols[] =
{{.name                  = "example-protocol", /* Protocol name*/.callback              = callback_example,   /* Protocol callback */.per_session_data_size = 0,                  /* Protocol callback 'userdata' size */.rx_buffer_size        = 0,                  /* Receve buffer size (0 = no restriction) */.id                    = 0,                  /* Protocol Id (version) (optional) */.user                  = NULL,               /* 'User data' ptr, to access in 'protocol callback */.tx_packet_size        = 0                   /* Transmission buffer size restriction (0 = no restriction) */},LWS_PROTOCOL_LIST_TERM /* terminator */
};int main( int argc, char *argv[] )
{struct lws_context_creation_info info;memset( &info, 0, sizeof(info) );info.port = CONTEXT_PORT_NO_LISTEN; /* we do not run any server */info.protocols = protocols;info.gid = -1;info.uid = -1;struct lws_context *context = lws_create_context( &info );time_t old = 0;while( 1 ){struct timeval tv;gettimeofday( &tv, NULL );/* Connect if we are not connected to the server. */if( !web_socket && tv.tv_sec != old ){struct lws_client_connect_info ccinfo;memset(&ccinfo, 0, sizeof(ccinfo));ccinfo.context = context;ccinfo.address = "localhost";ccinfo.port = 8000;ccinfo.path = "/";ccinfo.host = lws_canonical_hostname( context );ccinfo.origin = "origin";ccinfo.protocol = protocols[PROTOCOL_EXAMPLE].name;web_socket = lws_client_connect_via_info(&ccinfo);}if( tv.tv_sec != old ){/* Send a random number to the server every second. */lws_callback_on_writable( web_socket );old = tv.tv_sec;}lws_service( context, /* timeout_ms = */ 250 ); /* NOTE: since v3.2, timeout_ms may be set to '0', since it internally ignored */}lws_context_destroy( context );return 0;
}

后续会继续补充,使用上遇到的问题和解决方式

相关文章:

Linux下编译 libwebsockets简介和使用示例

目录 1&#xff1a;简单介绍&#xff1a; 2&#xff1a;项目地址 3&#xff1a;编译 3.1&#xff1a;集成介绍 3.2&#xff1a;编译 4&#xff1a;客户端服务端示例&#xff1a; 4.1 客户端示例 4.2 服务端示例&#xff1a; 1&#xff1a;简单介绍&#xff1a; Linux下…...

5G CPE接口扩展之轻量型多口千兆路由器小板选型

多口千兆路由器小板选型 方案一: 集成式5口千兆WIFI路由器小板方案二:交换板 + USBwifiUSB WIFI选型一USBwifi选型二:四口千兆选型一四口千兆选型二:四口千兆选型三:部分5G CPE主板不支持Wifi,并且网口数量较少,可采用堆叠方式进行网口和wifi功能 扩展,本文推荐一些路由…...

青少年编程与数学 02-005 移动Web编程基础 02课题、视口与像素

青少年编程与数学 02-005 移动Web编程基础 02课题、视口与像素 一、视口二、布局视口&#xff08;Layout Viewport&#xff09;三、视觉视口&#xff08;Visual Viewport&#xff09;四、理想视口&#xff08;Ideal Viewport&#xff09;五、视口设置关键属性示例代码示例1&…...

深度学习blog-Transformer-注意力机制和编码器解码器

注意力机制&#xff1a;当我们看一个图像或者听一段音频时&#xff0c;会根据自己的需求&#xff0c;集中注意力在关键元素上&#xff0c;以获取相关信息。 同样地&#xff0c;注意力机制中的模型也会根据输入的不同部分&#xff0c;给它们不同的权重&#xff0c;并集中注意力在…...

【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界

【IEEE出版|广东工业大学主办】第五届神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2025&#xff09;_艾思科蓝_学术一站式服务平台 目录 前言 一、Python—— 网络爬虫的绝佳拍档 二、网络爬虫基础&#xff1a;揭开神秘面纱 &#xff08;一&#xff09;工作原…...

【总结整理】 神经网络与深度学习 邱锡鹏 课后习题答案 扩展阅读链接

本文主要针对神经网络神经网络邱锡鹏 2~8 章的课后习题进行理解的过程中&#xff0c;搜索到的讲的会比较透彻的链接整理。适合有一定基础但是想了解更细的人阅读。 主要参考书籍 首先是本书pdf可在神经网络与深度学习获取&#xff1b; 主要参考的课后习题答案为nndl/solution…...

华为手机建议使用adb卸载的app

按需求自行卸载 echo 卸载智慧搜索 adb shell pm uninstall -k --user 0 com.huawei.search echo 卸载智慧助手 adb shell pm uninstall -k --user 0 com.huawei.intelligent echo 卸载讯飞语音引擎 adb shell pm uninstall -k --user 0 com.iflytek.speechsuite echo 卸载快应…...

找到一个linux静态库动态库的好资料.2

# 正文 继续整理从这个页面学到的东西&#xff1a;https://tldp.org/HOWTO/Program-Library-HOWTO 这一篇主要参考这俩&#xff1a; https://tldp.org/HOWTO/Program-Library-HOWTO/introduction.html https://tldp.org/HOWTO/Program-Library-HOWTO/static-libraries.html 这…...

存储块的原理与创建

目录 问题概述 malloc和free 固定块大小分配 设计原理 设计实现 为RTOS提供内存管理与回收机制 问题概述 malloc和free extern void *malloc(unsigned int num_bytes); //malloc向系统申请分配指定size个字节的内存空间。 //返回类型是void *类型 extern void free(void *ptr);…...

RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式&#xff08;工作队列&#xff09;10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 十.RabbitMQ 10.1 简单队列实现 简单队列通常指的是一个基本的消息队列&#xff0c;它可以用于…...

电脑提示报错NetLoad.dll文件丢失或损坏?是什么原因?

一、NetLoad.dll文件丢失或损坏的根源 程序安装不完整&#xff1a;某些程序在安装过程中可能因为磁盘错误、网络中断或安装程序本身的缺陷&#xff0c;导致NetLoad.dll文件未能正确安装或复制。 恶意软件攻击&#xff1a;病毒、木马等恶意软件可能会篡改或删除系统文件&#x…...

【物联网技术与应用】实验15:电位器传感器实验

实验15 电位器传感器实验 【实验介绍】 电位器可以帮助控制Arduino板上的LED闪烁的时间间隔。 【实验组件】 ● Arduino Uno主板* 1 ● 电位器模块* 1 ● USB电缆*1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 模拟电位器是模拟电子元件&#xff0c;模…...

WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)

项目中要用到样条曲线&#xff0c;必须过顶点&#xff0c;圆滑后还不能太走样&#xff0c;捣鼓一番&#xff0c;发现里面颇有玄机&#xff0c;于是把我多方抄来改造的方法发出来&#xff0c;方便新手&#xff1a; 如上图&#xff0c;看代码吧&#xff1a; -------------------…...

YOLOv9-0.1部分代码阅读笔记-assigner.py

assigner.py utils\tal\assigner.py 目录 assigner.py 1.所需的库和模块 2.def select_candidates_in_gts(xy_centers, gt_bboxes, eps1e-9): 3.def select_highest_overlaps(mask_pos, overlaps, n_max_boxes): 4.class TaskAlignedAssigner(nn.Module): 1.所需的库…...

mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现 在实际操作过程中&#xff0c;我们并不希望创建时间、修改时间这些来手动进行&#xff0c;而是希望通过自动化来完成&#xff0c;而mybatis-plus则也提供了自动填充功能来实现这一操作&#xff0c;接下来&#xff0c;就来了解一下mybatis…...

fgets TAILQ_INSERT_TAIL

If you’re using the macros from <sys/queue.h> to implement a circular doubly linked list (TAILQ), the inversion issue occurs because you’re using LIST_INSERT_HEAD, which inserts at the head of the list. Instead, to maintain the original order (FIFO…...

upload-labs关卡记录12

直接上传一句话木马&#xff0c;发现提示&#xff1a; 很明显这是一个白名单&#xff0c;而且不是前端的js检查&#xff0c;而是服务端的检查&#xff0c;因此我们使用bp抓包&#xff0c;改一下文件类型试试&#xff1a; 找到包之后&#xff0c;我们对content-type进行一个更改…...

服务器被攻击怎么办

当服务器遭受恶意流量攻击&#xff0c;如DDoS&#xff08;分布式拒绝服务&#xff09;或CC&#xff08;Challenge Collapsar&#xff09;攻击时&#xff0c;传统的防护措施可能不足以应对。此时&#xff0c;采用高防IP服务可以有效缓解攻击压力&#xff0c;确保业务连续性和数据…...

Node.js 助力前端开发:自动化操作实战

前端开发中&#xff0c;重复性任务如新建文件、配置路由、生成组件等&#xff0c;往往耗时且容易出错。借助 Node.js 的强大能力&#xff0c;我们可以实现开发过程中的自动化操作&#xff0c;提高效率。 文章目录 自动生成 router 配置文件自动生成组件模板动态构建导航菜单自…...

MATLAB符号计算-符号表达式基础运算操作

1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算&#xff08;算术运算、关系运算、逻辑运算&#xff09;&#xff0c;即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…...

ADB 上传文件并使用脚本监控上传百分比

有个需求&#xff0c;需要测试 emmc的外部连续写入性能&#xff0c;使用 ADB 上传一个巨大的文件。并且在上传到一定值时进行干预。 因此但是 adb push 命令本身会 block 运行并且不返回进度&#xff0c;因此需要一个额外的监控脚本。 上传脚本&#xff1a; echo off setloc…...

深入解析MySQL索引结构:从数组到B+树的演变与优化

前言&#xff1a; 在数据库查询中&#xff0c;索引是一种关键的性能优化工具。然而&#xff0c;索引的失效可能导致查询效率大幅下降。为了更好地理解索引的工作原理及规避其失效&#xff0c;深入了解索引结构的演变过程尤为重要。 MySQL 的索引数据结构从简单到复杂&#xff0…...

【玩转MacBook】JDK安装

下载 JDK 8 官网&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/archive/ 找到 JDK 8 选择&#xff1a; 安装 JDK 双击 .dmg 文件&#xff1a; 继续双击&#xff1a; “继续” “继续” 走到这里&#xff0c;我发现只能选择这个“为这台电脑上的所有…...

word无法创建工作文件,检查临时环境变量。

word无法创建工作文件&#xff0c;检查临时环境变量。 word preview版本&#xff0c;关联打开文件出现报错。word无法创建工作文件&#xff0c;检查临时环境变量。 打开注册表&#xff0c;删除键 Word Preview: HKCR\CLSID{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE} PowerPoint …...

威联通NAS部署openwrt软路由保姆级教程附镜像文件

创作立场&#xff1a;原创不易&#xff0c;拒绝搬运~ hello 大家好&#xff0c;我是你们的老伙伴&#xff0c;稳重的大王~ 本期教程为大家分享&#xff0c;怎么在NAS里面部署软路由&#xff0c;下面是软路由的镜像文件&#xff0c;有两个版本&#xff0c;400M的是定制版~ Sh…...

MySQL共享锁,排他锁

在 MySQL 中&#xff0c;共享锁&#xff08;S 锁&#xff09; 和 排他锁&#xff08;X 锁&#xff09; 是两种主要的锁机制&#xff0c;用于处理事务的并发控制。它们的作用和行为如下&#xff1a; 1. 共享锁 (S 锁) 定义&#xff1a; 共享锁允许事务对某一行数据进行读取&am…...

2. FPGA基础了解--全局网络

前言 引入扇出的概念介绍FPGA中的全局网络为后续时序优化埋下伏笔 扇出 在FPGA设计中扇出是一个重要的概念&#xff0c;所谓的扇出就是一个控制信号所能控制的数据信号的总个数&#xff0c;比如ctrl信号的扇出就是16 reg ctrl 0; reg [15:0] out 0; always (posedge c…...

[c++进阶(三)]单例模式及特殊类的设计

1.前言 在实际场景中,总会遇见一些特殊情况,比如设计一个类,只能在堆上开辟空间, 或者是设计一个类只能实例化一个对象。那么我们应该如何编写代码呢&#xff1f;本篇将会详细的介绍 本章重点&#xff1a; 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上…...

js版本之ES6特性简述【let和const、数组、函数、集合、Symbol】(四)

目录 let [块级作用域] 和const简述 Array.from Array.of Array.prototype中新增的方法 for...of 函数参数调整 集合类型 Map Set WeakMap WeakSet Set WeakSet Map WeakMap Symbol 类型 let [块级作用域] 和const简述 ES6 新增了let命令&#xff0c;用来声明变…...

重温设计模式--4、组合模式

文章目录 1 、组合模式&#xff08;Composite Pattern&#xff09;概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式&#xff08;Composite Pattern&#xff09;概述 定义&#xff1a;组合模式是一种结构型设计模式&#xff0c;它允许你将对象组合成…...

解决Ubuntu下无法装载 Windows D盘的问题

电脑安装了 Windows 和 Ubuntu 24.04 后&#xff0c;在Ubuntu系统上装载 D盘&#xff0c;发现无法装载错误如下&#xff1a; Error mounting /dev/nvme0n1p4 at /media/jackeysong/Data: wrong fs type, bad option, bad superblock on /dev/nvme0n1p4, missing codepage or h…...

详细介绍如何使用rapidjson读取json文件

本文主要详细介绍如何使用rapidjson库来实现.json文件的读取&#xff0c;分为相关基础介绍、结合简单示例进行基础介绍、结合复杂示例进行详细的函数实现介绍等三部分。 一、相关基础 1、Json文件中的{} 和 [] 在 JSON 文件中&#xff0c;{} 和 [] 分别表示不同的数据结构&…...

Mybatis 如何复用 SQL

比如你的Mapper是这样写的&#xff1a; 但这个接口是没有分页的&#xff0c;你还想再写一个有分页的查询接口&#xff0c;两个接口SQL一模一样&#xff0c;只是多了分页特性。你可以直接重载一个方法&#xff0c;增加分页参数&#xff0c;即可复用该SQL。如下&#xff1a;...

使用 Python 操作 MySQL 数据库的实用工具类:MySQLHandler

操作数据库是非常常见的需求&#xff0c;使用 Python 和 pymysql 库封装一个通用的 MySQL 数据库操作工具类&#xff0c;并通过示例演示如何使用这个工具类高效地管理数据库。 工具类的核心代码解析 MySQLHandler 类简介 MySQLHandler 是一个 Python 类&#xff0c;用于简化…...

C++ 内存管理:原理、技巧与实战

目录 第一章:C++ 内存管理基础 1.1 C++ 内存布局剖析 1.2 内存分配与释放:核心机制详解 1.2.1 new/delete 操作符 1.2.2 malloc/free 函数 第二章:智能指针 —— 内存管理利器 2.1 智能指针概览 2.2 常用智能指针类型 2.2.1 unique_ptr 2.2.2 shared_ptr 2.2.3 we…...

算法学习(17)—— FloodFill算法

目录 关于FloodFill算法 部分OJ题详解 733. 图像渲染 200. 岛屿数量 695. 岛屿的最大面积 130. 被围绕的区域 417. 太平洋大西洋水流问题 529. 扫雷问题 LCR130. 衣橱整理 关于FloodFill算法 爆搜&#xff0c;深搜&#xff0c;回溯的算法原理并不难&#xff0c;这类题…...

Kubernetes ConfigMap的创建与使用

前提条件 拥有Kubernetes集群环境&#xff0c;可参考&#xff1a;Kubernetes集群搭建理解Kubernetes部署知识&#xff0c;可参考&#xff1a;使用Kubernetes部署第一个应用 、Deloyment控制器 ConfigMap简介 ConfigMap 是 Kubernetes&#xff08;通常简称为 K8s&#xff09;中…...

灵当CRM uploadfile.php 文件上传致RCE漏洞复现

0x01 产品简介 灵当CRM是一款专为中小企业打造的智能客户关系管理工具,由上海灵当信息科技有限公司开发并运营。广泛应用于金融、教育、医疗、IT服务、房地产等多个行业领域,帮助企业实现客户个性化管理需求,提升企业竞争力。无论是新客户开拓、老客户维护,还是销售过程管…...

老旧小区用电安全保护装置#限流式防火保护器参数介绍#

摘要 随着居民住宅区用电负荷的增加&#xff0c;用电安全问题日益突出&#xff0c;火灾隐患频繁发生。防火限流式保护器作为一种新型电气安全设备&#xff0c;能够有效预防因电气故障引发的火灾事故。本文介绍了防火限流式保护器的工作原理、技术特点及其在居民住宅区用电系统…...

在git commit之前让其自动执行一次git pull命令

文章目录 背景原因编写脚本测试效果 背景原因 有时候可以看到项目的git 提交日志里好多 Merge branch ‘master’ of …记录。这些记录是怎么产生的呢&#xff1f; 是因为在本地操作 git add . 、 git commit -m "xxxxx"时&#xff0c;没有提前进行git pull操作&…...

【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)

文章目录 一、前言二、ShaderGraph1.什么是ShaderGraph2.在使用ShaderGraph时需要注意以下几点&#xff1a;3.优势4.项目 三、实例效果边缘发光进阶&#xff1a;带方向的菲涅尔边缘光效果裁剪进阶 带边缘色的裁剪溶解进阶 带边缘色溶解卡通阴影水波纹积雪效果不锈钢效果、冰晶效…...

单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?

单机和微服务的区别&#xff0c;微服务有什么问题&#xff1f;数据一致性问题怎么解决&#xff1f;幂等问题怎么解决&#xff1f; 单机架构和微服务架构在设计理念、部署和扩展性上有显著区别。 单机架构 vs 微服务架构 单机架构 定义&#xff1a;所有组件&#xff08;前端…...

McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构

原文链接 1 mcdonalds-technical-blog/ 原文链接 2 mcdonalds-technical-blog/ 麦当劳在异步、事务性和分析性处理用例中使用跨技术栈的事件&#xff0c;包括移动订单进度跟踪和向客户发送营销通信&#xff08;交易和促销&#xff09;。 统一事件平台&#xff08;unified eve…...

Clickhouse(Centos)

地址信息 官网地址&#xff1a;Fast Open-Source OLAP DBMS - ClickHouse 下载地址&#xff1a;packages.clickhouse.com/rpm/stable/ 1.clickhouse-client-23.1.3.5.x86_64.rpm 2.clickhouse-common-static-23.1.3.5.x86_64.rpm 3.clickhouse-common-static-dbg-23.1.3.5.x86_…...

赛博错题本

机构抽象老师非得让我们整一个错题本&#xff0c;我寻思都学计算机了&#xff0c;还在整高中做题呢一套是什么意思呢&#xff0c;更何况考试也就一周一次&#xff0c;你整个本完完全全没有必要&#xff0c;整个赛博错题本得了。以后错题都会存在这里&#xff0c;基本上一周一更…...

【MySQL初阶】Ubuntu 环境安装 MySQL

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; 数据库初阶 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 Ubuntu 系统安装 MySQL 的相关内容。 如果看到最后您觉得这篇…...

【Kubernetes 指南】基础入门——Kubernetes 基本概念(二)

目录 二、Pod 1、Pod 简介 2、Pod 图示 3、nginx 容器 二、Pod 1、Pod 简介 - Kubernetes 使用 Pod 来管理容器&#xff0c;每个 Pod 可以包含一个或多个紧密关联的容器。 - Pod 是一组紧密关联的容器集合&#xff0c;它们共享 PID、IPC、Network 和 UTS namespace&#…...

Ubuntu系统下 npm install -g tauri 报错问题处理

处理在安装 Tauri 时遇到的问题&#xff0c;可以按照以下步骤进行操作 npm install -g taurinpm warn deprecated inflight1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async …...

数字逻辑(六)——下载Digital软件

Digital是一种用于设计和仿真数字逻辑电路的教育工具&#xff0c;它是免费、开源和跨平台的。这款软件十分适合新人&#xff0c;可以使用画简单的电路。 1 下载Digital软件 首先Digital的下载地址是&#xff1a; https://github.com/hneemann/Digital ​ 下载完成之后&…...

Ruby Raider使用教程

Ruby Raider是什么&#xff1f; Ruby Raider 是一款生成器和脚手架 gem&#xff0c;可让 UI 测试自动化更容易 Github链接&#xff1a;https://github.com/RaiderHQ/ruby_raider 目前支持的框架 Web自动化测试 Cucumber and Selenium Rspec and Selenium Cucumber and Wa…...