Linux下编译 libwebsockets简介和使用示例
目录
1:简单介绍:
2:项目地址
3:编译
3.1:集成介绍
3.2:编译
4:客户端服务端示例:
4.1 客户端示例
4.2 服务端示例:
1:简单介绍:
Linux下编译libwebsockets和使用简单示例,给需要的各位参考
libwebsockets
是一个小巧强大的库,它使用 C 语言编写,可以帮助开发者轻松实现 WebSocket 协议。WebSocket 是一种网络通信协议,它允许服务器和客户端之间建立一个持久的连接,这样双方就可以实时地发送和接收消息了。
优点
- 轻量级和高效:libwebsockets 设计为轻量级,适合嵌入式系统和资源受限的环境,能够高效地处理 WebSocket 和 HTTP 请求。
- 双向通信:支持全双工通信,允许服务器主动推送数据到客户端,减少了延迟。
- 较少的通信开销:相比于传统的 HTTP 协议,WebSocket 的通信开销较小,因为它在建立连接后可以持续使用同一连接进行数据交换。
- 多协议支持:除了 WebSocket,libwebsockets 还支持 HTTP/1、HTTP/2、MQTT 等多种协议,具有良好的扩展性。
- 安全性:内建对 SSL/TLS 的支持,能够实现安全的通信
缺点
- 复杂性:libwebsockets 的接口较底层,许多逻辑需要开发者自行封装实现,这可能增加开发的复杂性。
- 线程安全性:该库不是线程安全的,因此在多线程环境中使用时需要特别注意线程和锁的管理。
- 兼容性问题:虽然大多数现代浏览器支持 WebSocket,但在一些旧版浏览器中可能存在兼容性问题。
- 重连机制:WebSocket 需要处理网络不稳定时的重连问题,这在某些情况下可能会导致实现上的复杂性。
2:项目地址
这里有几个不同的地址,防止有些网络问题获取不到
github地址:
warmcat/libwebsockets: canonical libwebsockets.org networking libraryhttps://github.com/warmcat/libwebsocketsgitcode地址:GitCode - 全球开发者的开源社区,开源代码托管平台
https://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.https://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 Examplehttps://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:简单介绍: 2:项目地址 3:编译 3.1:集成介绍 3.2:编译 4:客户端服务端示例: 4.1 客户端示例 4.2 服务端示例: 1:简单介绍: Linux下…...
5G CPE接口扩展之轻量型多口千兆路由器小板选型
多口千兆路由器小板选型 方案一: 集成式5口千兆WIFI路由器小板方案二:交换板 + USBwifiUSB WIFI选型一USBwifi选型二:四口千兆选型一四口千兆选型二:四口千兆选型三:部分5G CPE主板不支持Wifi,并且网口数量较少,可采用堆叠方式进行网口和wifi功能 扩展,本文推荐一些路由…...
青少年编程与数学 02-005 移动Web编程基础 02课题、视口与像素
青少年编程与数学 02-005 移动Web编程基础 02课题、视口与像素 一、视口二、布局视口(Layout Viewport)三、视觉视口(Visual Viewport)四、理想视口(Ideal Viewport)五、视口设置关键属性示例代码示例1&…...
深度学习blog-Transformer-注意力机制和编码器解码器
注意力机制:当我们看一个图像或者听一段音频时,会根据自己的需求,集中注意力在关键元素上,以获取相关信息。 同样地,注意力机制中的模型也会根据输入的不同部分,给它们不同的权重,并集中注意力在…...
【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界
【IEEE出版|广东工业大学主办】第五届神经网络、信息与通信工程国际学术会议(NNICE 2025)_艾思科蓝_学术一站式服务平台 目录 前言 一、Python—— 网络爬虫的绝佳拍档 二、网络爬虫基础:揭开神秘面纱 (一)工作原…...
【总结整理】 神经网络与深度学习 邱锡鹏 课后习题答案 扩展阅读链接
本文主要针对神经网络神经网络邱锡鹏 2~8 章的课后习题进行理解的过程中,搜索到的讲的会比较透彻的链接整理。适合有一定基础但是想了解更细的人阅读。 主要参考书籍 首先是本书pdf可在神经网络与深度学习获取; 主要参考的课后习题答案为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
# 正文 继续整理从这个页面学到的东西:https://tldp.org/HOWTO/Program-Library-HOWTO 这一篇主要参考这俩: 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 模式(工作队列)10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 十.RabbitMQ 10.1 简单队列实现 简单队列通常指的是一个基本的消息队列,它可以用于…...
电脑提示报错NetLoad.dll文件丢失或损坏?是什么原因?
一、NetLoad.dll文件丢失或损坏的根源 程序安装不完整:某些程序在安装过程中可能因为磁盘错误、网络中断或安装程序本身的缺陷,导致NetLoad.dll文件未能正确安装或复制。 恶意软件攻击:病毒、木马等恶意软件可能会篡改或删除系统文件&#x…...
【物联网技术与应用】实验15:电位器传感器实验
实验15 电位器传感器实验 【实验介绍】 电位器可以帮助控制Arduino板上的LED闪烁的时间间隔。 【实验组件】 ● Arduino Uno主板* 1 ● 电位器模块* 1 ● USB电缆*1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 模拟电位器是模拟电子元件,模…...
WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)
项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: -------------------…...
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自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下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
直接上传一句话木马,发现提示: 很明显这是一个白名单,而且不是前端的js检查,而是服务端的检查,因此我们使用bp抓包,改一下文件类型试试: 找到包之后,我们对content-type进行一个更改…...
服务器被攻击怎么办
当服务器遭受恶意流量攻击,如DDoS(分布式拒绝服务)或CC(Challenge Collapsar)攻击时,传统的防护措施可能不足以应对。此时,采用高防IP服务可以有效缓解攻击压力,确保业务连续性和数据…...
Node.js 助力前端开发:自动化操作实战
前端开发中,重复性任务如新建文件、配置路由、生成组件等,往往耗时且容易出错。借助 Node.js 的强大能力,我们可以实现开发过程中的自动化操作,提高效率。 文章目录 自动生成 router 配置文件自动生成组件模板动态构建导航菜单自…...
MATLAB符号计算-符号表达式基础运算操作
1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算(算术运算、关系运算、逻辑运算),即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…...
ADB 上传文件并使用脚本监控上传百分比
有个需求,需要测试 emmc的外部连续写入性能,使用 ADB 上传一个巨大的文件。并且在上传到一定值时进行干预。 因此但是 adb push 命令本身会 block 运行并且不返回进度,因此需要一个额外的监控脚本。 上传脚本: echo off setloc…...
深入解析MySQL索引结构:从数组到B+树的演变与优化
前言: 在数据库查询中,索引是一种关键的性能优化工具。然而,索引的失效可能导致查询效率大幅下降。为了更好地理解索引的工作原理及规避其失效,深入了解索引结构的演变过程尤为重要。 MySQL 的索引数据结构从简单到复杂࿰…...
【玩转MacBook】JDK安装
下载 JDK 8 官网:https://www.oracle.com/cn/java/technologies/downloads/archive/ 找到 JDK 8 选择: 安装 JDK 双击 .dmg 文件: 继续双击: “继续” “继续” 走到这里,我发现只能选择这个“为这台电脑上的所有…...
word无法创建工作文件,检查临时环境变量。
word无法创建工作文件,检查临时环境变量。 word preview版本,关联打开文件出现报错。word无法创建工作文件,检查临时环境变量。 打开注册表,删除键 Word Preview: HKCR\CLSID{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE} PowerPoint …...
威联通NAS部署openwrt软路由保姆级教程附镜像文件
创作立场:原创不易,拒绝搬运~ hello 大家好,我是你们的老伙伴,稳重的大王~ 本期教程为大家分享,怎么在NAS里面部署软路由,下面是软路由的镜像文件,有两个版本,400M的是定制版~ Sh…...
MySQL共享锁,排他锁
在 MySQL 中,共享锁(S 锁) 和 排他锁(X 锁) 是两种主要的锁机制,用于处理事务的并发控制。它们的作用和行为如下: 1. 共享锁 (S 锁) 定义: 共享锁允许事务对某一行数据进行读取&am…...
2. FPGA基础了解--全局网络
前言 引入扇出的概念介绍FPGA中的全局网络为后续时序优化埋下伏笔 扇出 在FPGA设计中扇出是一个重要的概念,所谓的扇出就是一个控制信号所能控制的数据信号的总个数,比如ctrl信号的扇出就是16 reg ctrl 0; reg [15:0] out 0; always (posedge c…...
[c++进阶(三)]单例模式及特殊类的设计
1.前言 在实际场景中,总会遇见一些特殊情况,比如设计一个类,只能在堆上开辟空间, 或者是设计一个类只能实例化一个对象。那么我们应该如何编写代码呢?本篇将会详细的介绍 本章重点: 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上…...
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命令,用来声明变…...
重温设计模式--4、组合模式
文章目录 1 、组合模式(Composite Pattern)概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式(Composite Pattern)概述 定义:组合模式是一种结构型设计模式,它允许你将对象组合成…...
解决Ubuntu下无法装载 Windows D盘的问题
电脑安装了 Windows 和 Ubuntu 24.04 后,在Ubuntu系统上装载 D盘,发现无法装载错误如下: 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文件的读取,分为相关基础介绍、结合简单示例进行基础介绍、结合复杂示例进行详细的函数实现介绍等三部分。 一、相关基础 1、Json文件中的{} 和 [] 在 JSON 文件中,{} 和 [] 分别表示不同的数据结构&…...
Mybatis 如何复用 SQL
比如你的Mapper是这样写的: 但这个接口是没有分页的,你还想再写一个有分页的查询接口,两个接口SQL一模一样,只是多了分页特性。你可以直接重载一个方法,增加分页参数,即可复用该SQL。如下:...
使用 Python 操作 MySQL 数据库的实用工具类:MySQLHandler
操作数据库是非常常见的需求,使用 Python 和 pymysql 库封装一个通用的 MySQL 数据库操作工具类,并通过示例演示如何使用这个工具类高效地管理数据库。 工具类的核心代码解析 MySQLHandler 类简介 MySQLHandler 是一个 Python 类,用于简化…...
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算法 爆搜,深搜,回溯的算法原理并不难,这类题…...
Kubernetes ConfigMap的创建与使用
前提条件 拥有Kubernetes集群环境,可参考:Kubernetes集群搭建理解Kubernetes部署知识,可参考:使用Kubernetes部署第一个应用 、Deloyment控制器 ConfigMap简介 ConfigMap 是 Kubernetes(通常简称为 K8s)中…...
灵当CRM uploadfile.php 文件上传致RCE漏洞复现
0x01 产品简介 灵当CRM是一款专为中小企业打造的智能客户关系管理工具,由上海灵当信息科技有限公司开发并运营。广泛应用于金融、教育、医疗、IT服务、房地产等多个行业领域,帮助企业实现客户个性化管理需求,提升企业竞争力。无论是新客户开拓、老客户维护,还是销售过程管…...
老旧小区用电安全保护装置#限流式防火保护器参数介绍#
摘要 随着居民住宅区用电负荷的增加,用电安全问题日益突出,火灾隐患频繁发生。防火限流式保护器作为一种新型电气安全设备,能够有效预防因电气故障引发的火灾事故。本文介绍了防火限流式保护器的工作原理、技术特点及其在居民住宅区用电系统…...
在git commit之前让其自动执行一次git pull命令
文章目录 背景原因编写脚本测试效果 背景原因 有时候可以看到项目的git 提交日志里好多 Merge branch ‘master’ of …记录。这些记录是怎么产生的呢? 是因为在本地操作 git add . 、 git commit -m "xxxxx"时,没有提前进行git pull操作&…...
【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)
文章目录 一、前言二、ShaderGraph1.什么是ShaderGraph2.在使用ShaderGraph时需要注意以下几点:3.优势4.项目 三、实例效果边缘发光进阶:带方向的菲涅尔边缘光效果裁剪进阶 带边缘色的裁剪溶解进阶 带边缘色溶解卡通阴影水波纹积雪效果不锈钢效果、冰晶效…...
单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?
单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决? 单机架构和微服务架构在设计理念、部署和扩展性上有显著区别。 单机架构 vs 微服务架构 单机架构 定义:所有组件(前端…...
McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构
原文链接 1 mcdonalds-technical-blog/ 原文链接 2 mcdonalds-technical-blog/ 麦当劳在异步、事务性和分析性处理用例中使用跨技术栈的事件,包括移动订单进度跟踪和向客户发送营销通信(交易和促销)。 统一事件平台(unified eve…...
Clickhouse(Centos)
地址信息 官网地址:Fast Open-Source OLAP DBMS - ClickHouse 下载地址: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_…...
赛博错题本
机构抽象老师非得让我们整一个错题本,我寻思都学计算机了,还在整高中做题呢一套是什么意思呢,更何况考试也就一周一次,你整个本完完全全没有必要,整个赛博错题本得了。以后错题都会存在这里,基本上一周一更…...
【MySQL初阶】Ubuntu 环境安装 MySQL
🎉博主首页: 有趣的中国人 🎉专栏首页: 数据库初阶 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 Ubuntu 系统安装 MySQL 的相关内容。 如果看到最后您觉得这篇…...
【Kubernetes 指南】基础入门——Kubernetes 基本概念(二)
目录 二、Pod 1、Pod 简介 2、Pod 图示 3、nginx 容器 二、Pod 1、Pod 简介 - Kubernetes 使用 Pod 来管理容器,每个 Pod 可以包含一个或多个紧密关联的容器。 - Pod 是一组紧密关联的容器集合,它们共享 PID、IPC、Network 和 UTS namespace&#…...
Ubuntu系统下 npm install -g tauri 报错问题处理
处理在安装 Tauri 时遇到的问题,可以按照以下步骤进行操作 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是一种用于设计和仿真数字逻辑电路的教育工具,它是免费、开源和跨平台的。这款软件十分适合新人,可以使用画简单的电路。 1 下载Digital软件 首先Digital的下载地址是: https://github.com/hneemann/Digital 下载完成之后&…...
Ruby Raider使用教程
Ruby Raider是什么? Ruby Raider 是一款生成器和脚手架 gem,可让 UI 测试自动化更容易 Github链接:https://github.com/RaiderHQ/ruby_raider 目前支持的框架 Web自动化测试 Cucumber and Selenium Rspec and Selenium Cucumber and Wa…...