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

自定义协议与序列化

前言

书接上回,我们上一篇提到了协议并且我们草率的写了一个协议,然后又对TCP的R和W留了一个伏笔,我们今天彻底做个了断。

UDP是面向数据报的,它要么不读,要么就是一次读完的,所以不存在数据断断续续的问题,但是TCP是面向字节流的,所以它一次读的数据并不一定是完整的。

然后我们在来谈RW的问题,我们的RW真的是直接读到数据就发给对方吗?

其实不是的

我们可以先跳过序列化的过程直接看底层,所以实际上我们的RW只是负责把信息发给缓冲区或者从缓冲区读,它们的本质只是拷贝,怎么发,发多少,发错了咋办,这些它都不管。

这一块归TCP协议自主决定,所以TCP叫传输控制协议,再进一步,我们TCP就算发,它叫发吗,它也只是把本地信息拷贝到网络中,所以通信即拷贝。

我们两台TCP的主机,四个缓冲区,其实就是生产者消费者模型。

序列化/反序列化

我们上面那张图,中间好像缺了一块,不是我画的丑,我们现在来讲缺失的那一块。

我们如果传消息,它有消息的内容、时间、谁等等属性,那我们是一段一段发吗,这也太麻烦了,那用结构体合并起来发怎么样呢,可以,但是每个语言对齐标准不一样,你用结构体虽然可以,但是只能是同语言之间发,限制太大了,所以,有了序列化的方法,它把上面的信息全合并成一条字符串,中间可能用什么符号隔开,这一条字符串发过去,啥语言没字符串,也不需要考虑对齐。

对方收到以后,我们都可以通信了诶,那我们总要有共同的协议吧,它就按协议里的规则再把字符串给拆分,就拿到信息了,这叫反序列化。

把这一块加入上图,是不是就完整了,也更能明白,为啥会断断续续的发,因为就算我们合成一条字符串信息,但是发多少还是TCP协议自主决定的,所以这种情况下我们是不能反序列化的,得等拿到完整的信息才能反序列化。它能少,也能多,你也有可能一次收到多条信息呢。这种就叫面向字节流。

 模版模式封装Socket

直接进入代码环节

我们之前讲完UDP和TCP,我们发现它俩方法都差不多,虽然我们都各自封装了,但是还不够,我们C++学完后就能感觉有点似曾相识的感觉呢,继承多态。

我们用一个基类,而基类具体实现哪种方法取决于我们传什么子类。

是的,我们之前UDP和TCP的偷懒封装在这更进一步了,我们直接用一个基类合并了它们俩。

具体的实现,就取决于我们是UDP还是TCP,但是上层,只关心你传的基类。而我基类的初始化,那不就是调用对应类型的方法,我传TCP就调TCP的初始化,UDP就UDP的。

今天我们是TCP它还有个accept连接呢。

为啥我们不简单返回套接字呢,因为我们返回子类对象,后续基类拿到以后也可以直接调用子类的方法,去除差异化。

服务端

我们方法都封装好了,所以服务端反而变简单了。

老样子提供端口号,然后基类对象,判断是否在运行,然后提供信息处理方法就完了。唯一不太一样的就是今天我们的listen是去构建一个子类对象,而不是自己listen。

然后又是熟悉的死循环起手,接收客户端信息,建立连接,然后用多线程的方法,让父进程负责寻找客户端信息,带给我们的子进程,而子进程收到信息后,先关闭不需要的套接字,然后自己退出,让孙子进程对我们的客户端信息做处理。

那么方法还不是我们要做啥操作传啥方法。

那现在,我们来详谈方法。我们先得明确,我客户端对你服务端有特定的协议规定,而你服务端对客户端也有特定的协议,这俩不是共用一套协议的,或者说是在一套大协议下,用里面约束自己的那一套协议。

客户端协议

这要是按我们自己定义的,中间加个符号之类的隔开作为区分,那这个协议和我们前面写的是没啥区别的,而且局限性很大,往往方法一改变就得作废,所以我们今天用新的方法。

有点麻烦,但是没办法,它有点像pair,也是key:value对应的。那这不就能让字符串和数据自动关联上了吗。 

结果大概就长这样。

所以序列化就是把数据线变字符串,反序列化就是把数据先恢复成对应的类型,然后提取内容。

服务端协议

服务端和客户端大同小异,本质就是转化 、操作、把结果再转化发回给对方。可是,我们TCP是面向字节流啊,你序列化了也不能保证一次就是完整的一条数据不多不少。所以我们需要进一步完善协议。

协议部分

OK 我们现在有对客户端和服务端的协议了,我们现在需要给它俩包起来,在我们真正使用时可以自由使用任意一个。

我们这个更大的外层,包含了客户端转服务端的方法,这样服务端才知道如何具体处理客户端的信息。

然后我们规定了客户端发送信息以什么格式发送。

然后服务端又如何接收,实际上就是拆分的过程,我们先找\r\n,如果可以找到,那它至少可能是个报文,如果\r\n都没有,说明它无法构成完整报文了。

然后我们再读取出它的长度部分,把它一转化就得到了信息内容的长度,那么加上两个分隔符的长度就是我们这一条报文的总长度。

如果传入的信息和我们的长度对不上,那说明也有问题,它也不算一条正常的报文。

走到这一步,上面就算找到完整的报文了,那我们把它从第一个分隔符之后开始一直提取到长度位置,就得到了这一条报文,还不算完,我们还要善后,把我们读取到的部分删除,因为我们无法确定是不是刚好TCP就传了一条协议,也许后面还有内容。

这样下次进来就是新的开始。

消息处理的具体方法

今天我们的方法是实现计算器,那么我们就得规定具体如何处理客户端传入的信息。这也就是我们如何让Request转成Response。

所以我们明确规定一进来,Response的两个参数都是0,而想要它变化,就看Switch走哪条了,并且针对除法,还设置了code的值,以及除了+-*/四种运算符外的情况。

最后返回计算结果,这既是我们的处理方法。

而我们的外部也变成了这样,先声明一个Cal方法,把它传入协议里,再把协议传入线程里,这样就实现了多层次的解决方法。

我线程一调用到GetResq函数,它就先接收客户端信息,然后利用while反复判断是否拿到一条完整报文,并不断将它写入到我们传入的容器内,然后对它反序列化得到客户端传入的信息,这时候再用Response接收我们回调后的结果,也就是Cal的运算结果。

取得运算结果后,我们还得序列化转成字符串,再加上我们的协议格式,然后给客户端发回去。

客户端部分

OK我们铺垫这么久,客户端要做的其实没啥了,就发消息罢了,上面把序列化反序列化、怎么接收怎么发回都搞定了。

所以我们先拿一下服务端的信息再创建一个套接字。

然后又是让用户输入要计算的内容,并且不是算一次就退,所以又是while死循环。

然后就让客户端的数据先初始化一下Request,再序列化它然后添加我们的格式。

格式也设置好以后就可以发出了,我们不必担心不知道发给谁的问题,底层已经给我们封装好了我们的send函数,它在你Build的时候就拿到你的套接字了。

然后就是等待服务端计算完毕,然后返回结果给我们打印了。

至于GetResponse和我们上面的GetResq它是大同小异的,因为我们的协议规定了格式,所以不论是服务端还是客户端,它的读取方式都是一样的。

同样是先收数据,因为我们不一定能一次读完一段完整的数据,所以我们的采用+=的方式。

如果没有读到完整的数据,比如半条,那我们就continue继续读呗,直到有一条完整数据。

然后老样子反序列化,这次就不用序列化了,因为我们就是客户端了。

那么我们现在再来看,我们就会发现我们的操作都是定义上三层的部分,其他层都由操作系统和协议解决了,所以,书上说TCP协议好是好但是无法完全模拟实现就是这种原因,操作系统和协议再牛,也无法统一用户的需求。

守护进程

我们先来从下往上说。

我们可以看到我们三个命令用管道联通起来,然后我已查询就查出了他们仨,我们细看PGID,这个是进程组ID,进程组由多个进程构成,进程组帮我们完成任务,一个进程组可以只有一个进程。

多个进程进程组ID以第一个为组ID,如果只有一个的话就是自己。

只要组里还有成员,进程组组就存在,即使组长GG。

进程组就像一个小团队,它内部的进程共同负责某一块任务,当然也有可能组内就一个成员。

SID,这个叫:会话ID,一个会话内可以有多个或一个进程组,我们一登录,操作系统就会给我们创建一个会话,而这个会话至少有一个进程组也就是bash,会话ID就是bash的ID。

我们进行的任意操作,都是在这个会话内创建新的进程组。

那在会话内也是分前后台进程的,输出的话无所谓,你就算100个一起输出它也能输出,用户也看得见,但是输入,只能有一个,因为你不能同时给100个进程输入命令。

所以区分为一个前台多个后台进程,输入的命令只给前台,后台不受影响。

以前的电脑有注销这个选项,注销即删除会话,然后创建新的会话,这样上一位的会话就被结束了,可是我们的服务器不能受到销毁会话的影响,所以就有了守护进程的概念。

守护进程

守护进程就是把我们的服务器迁移到新的会话,这样旧会话即使被销毁也不会影响我们的服务器了

setsid(); 这样就能创建新会话,很简单吧。

前提是它不能是进程组的组长,所以我们采取fork创建子进程,然后关闭父进程,用子进程setsid ,所以守护进程算一种孤儿进程。并且守护进程不想和标准输入输出错误产生联系,一般是直接和网络通信。

所以我们把守护进程的输入输出错误全部链到/dev/null 这个路径下的文件其实就是垃圾桶,输入的内容会被丢弃,读取的内容为空。

实现

我们看上面那么多字,其实它很简单,说白了就是子进程调用个函数把我们的服务器迁移过去罢了。

是的,它很简单就能实现,甚至系统调用都给你准备好了。

好了下一篇我们就要真正进入网络了。

相关文章:

自定义协议与序列化

前言 书接上回,我们上一篇提到了协议并且我们草率的写了一个协议,然后又对TCP的R和W留了一个伏笔,我们今天彻底做个了断。 UDP是面向数据报的,它要么不读,要么就是一次读完的,所以不存在数据断断续续的问…...

MySQL中的Change Buffer是什么,它有什么作用?

MySQL 中的 Change Buffer(更改缓冲区)是 InnoDB 存储引擎使用的一种特殊数据结构,主要用于优化对二级索引(secondary indexes)的写操作性能。 它的核心作用是: 当对表进行 INSERT、UPDATE 或 DELETE 操作…...

Ubuntu 20.04之Docker安装ES7.17.14和Kibana7.17.14

你需要已经安装如下运行环境: Ubuntu 20.04 docker 28 docker-compose 1.25 一、手动拉取镜像 docker pull docker.elastic.co/kibana/kibana:7.17.14docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.14 或者手动导入镜像 docker load -i es7.17.14.ta…...

ThreadLocal作一个缓存工具类

1、工具类 import java.util.HashMap; import java.util.Map;public class ThreadLocalUtil {// 使用Map存储多类型数据private static final ThreadLocal<Map<String, Object>> CONTEXT_HOLDER new ThreadLocal<>();// 存储数据public static void set(Str…...

DeepSeek在旅游行业的智能化革命

2025年,从贵州全域智慧旅游平台的行程规划革命,到黄山景区"AI旅行助手"的实时服务升级,再到宁夏"游宁AI"的全域智能导览,DeepSeek通过技术创新与行业场景的深度融合,正在重新定义"智慧旅游"的内涵。这场变革不仅体现在效率提升层面,更通过…...

说一下响应状态码有哪些?

HTTP响应状态码分类(RFC 7231标准) 1. 1xx(信息类) 临时响应,表示请求已被接收,需要继续处理 100 Continue:客户端应继续发送请求体 101 Switching Protocols:服务器同意升级协议(如WebSocket) 102 Processing(WebDAV):服务器正在处理但未完成 2. 2xx(成功类)…...

ABAP实战案例--获取当前数据由哪个用户锁住

1、业务场景&#xff1a; A用户正在打开订单&#xff0c;订单已上锁&#xff1b;B用户打开时只允许查看并提醒由哪个用户正在操作该笔订单。 2、函数使用&#xff1a;ENQUEUE_READ 代码示例&#xff1a; DATA:LV_MESSAGE TYPE SY-MSGV1,LV_UNAME TYPE UNAME.DATA:LV_GARG …...

CSS 选择器入门

一、CSS 选择器基础&#xff1a;快速掌握核心概念 什么是选择器&#xff1f; CSS 选择器就像 “网页元素的遥控器”&#xff0c;用于定位 HTML 中的特定元素并应用样式。 /* 结构&#xff1a;选择器 { 属性: 值; } */ p { color: red; } /* 选择所有<p>元素&#xff0c;…...

【深度学习新浪潮】如何入门人工智能?

入门人工智能(AI)需要结合数学基础、编程技能、机器学习理论和实践项目,逐步深入。以下是一个系统的学习路径,适合零基础或初学者参考: 一、打好基础:数学与编程 1. 数学基础(关键) AI的核心依赖数学,尤其是以下领域: 线性代数:向量、矩阵运算、特征分解等(用于…...

软件工程第六章-详细设计

文章目录 程序流程图PAD图N-S图(盒图)流图根据PDL创建流图把程序流程图映射到流图 程序流程图 PAD图 N-S图(盒图) 流图 根据PDL创建流图 把程序流程图映射到流图...

Profinet转Modbus TCP协议转换技术,打通能耗监控‘最后一公里’

在工业自动化领域&#xff0c;Profinet与Modbus TCP是两种广泛使用的通讯协议。Profinet通常用于实时性要求较高的工业控制系统&#xff0c;而Modbus TCP则因其简单、开放的特性广泛应用于各类设备的通信。然而&#xff0c;由于两者在技术规范上的差异&#xff0c;直接的互联互…...

C++:因子问题

【描述】 任给两个正整数N、M&#xff0c;求一个最小的正整数a&#xff0c;使得a和(M-a)都是N的因子。 【输入】 包括两个整数N、M。N不超过1,000,000。 【输出】 输出一个整数a&#xff0c;表示结果。如果某个案例中满足条件的正整数不存在&#xff0c;则在对应行输出-1 【样例…...

SAP系统的委外业务是什么?委外采购(标准委外)与工序外协的区别有哪些?

【SAP系统研究】 #SAP #委外 #外包 #代工 委外业务是很常见的业务类型。 企业生产过程中,会在自制生产之外,产生委外加工业务,也称之为外包或者代工。还有一些企业,自己只负责设计、市场等业务,而将生产加工环节交给其他公司。 一、委外产生的原因 有的企业由于环评、…...

小乌龟git中的推送账户、作者账户信息修改

文章目录 修改git文档作者信息修改git推送用户信息参考文献 修改git文档作者信息 小乌龟中的用户信息为&#xff1a;作者信息&#xff0c;并非推送用户。 上边用户信息&#xff0c;修改的是文件的作者信息。如果想要修改git服务中记录的推送用户信息需要修改推送用户信息。 …...

vue2.0 组件

个人简介 &#x1f468;‍&#x1f4bb;‍个人主页&#xff1a; 魔术师 &#x1f4d6;学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全栈发展 &#x1f6b4;个人状态&#xff1a; 研发工程师&#xff0c;现效力于政务服务网事业 &#x1f1e8;&#x1f1f3;人生格言&…...

5月19日笔记

BGP的路由聚合 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09;是互联网中用于在不同自治系统&#xff08;AS&#xff09;之间交换路由信息的一种协议。在BGP中&#xff0c;路由聚合是一种技术&#xff0c;它允许网络管理员通过减少路由表中冗余的…...

【SPIN】PROMELA并发编程(SPIN学习系列--3)

一、active与run&#xff1a;Promela的进程创建基石 在Promela语言中&#xff0c;**active和run**是构建并发模型的核心关键字&#xff0c;分别用于定义主动进程和动态创建被动进程&#xff1a; active proctype <进程名>() 作用&#xff1a;声明主动进程类型&#xff0…...

深入理解 Redisson 看门狗机制:保障分布式锁自动续期

在分布式系统的开发中&#xff0c;分布式锁是解决资源竞争、数据一致性问题的关键手段。Redisson 作为一个在 Java 领域广泛使用的 Redis 客户端框架&#xff0c;为我们提供了功能强大且易用的分布式锁实现。其中&#xff0c;看门狗&#xff08;watchDog&#xff09;机制更是 R…...

App 发布后才想起安全?iOS 后置混淆的实战方法与工具路线(含 Ipa Guard 应用体验)

作为一名 iOS 开发者&#xff0c;我们对“上线前打包”和“上线后复盘”都不会陌生。但坦白说&#xff0c;在忙完功能、优化、测试、提交审核这些流程之后&#xff0c;大多数人对“App 安全”只剩下一个念头&#xff1a;上线了&#xff0c;就算了吧。 然而&#xff0c;真正在 …...

k8s1.27集群部署mysql8.0双主双从

环境介绍&#xff1a; #节点分配 159m--->两个master&#xff0c;生产环境建议&#xff0c;一个master一个节点。 160n-->slave-0 161n-->slaves-0 #存储卷 pv-->放在节点上&#xff0c;没用nfs/云存储。hostpath方式存储。pv的资源分配1G&#xff0c;较小&#…...

C++经典库介绍

在 C 开发的漫长历程中&#xff0c;涌现出了许多经典的库&#xff0c;它们在不同的领域发挥着重要作用&#xff0c;极大地提升了 C 开发的效率和质量。下面为你介绍一些 C 开发中的经典库。 标准模板库&#xff08;STL&#xff09; STL 堪称 C 编程领域的基石&#xff0c;是每…...

树莓派系列教程第八弹:结合 ESP32-CAM 实现远程摄像头监控

在当今数字化时代&#xff0c;远程监控技术已经渗透到我们生活的方方面面。无论是家庭安防、远程办公&#xff0c;还是物联网设备的监控&#xff0c;能够随时随地查看摄像头的画面都显得尤为重要。今天&#xff0c;我们将带你走进一个充满创意和技术挑战的项目——利用树莓派和…...

AI人工智能写作平台:AnKo助力内容创作变革!

AI人工智能写作平台&#xff1a;AnKo助力内容创作变革&#xff01; AI人工智能写作平台正改变内容创作方式。AnKo作为领先的AI人工智能写作平台&#xff0c;免费为用户提供强大创作支持。AnKo AI人工智能写作平台整合多模型技术&#xff0c;提升写作效率和质量。 AI人工智能写…...

学习黑客 PowerShell 详解

PowerShell 详解&#xff1a;管道、过滤和常用命令技术指南 &#x1f680; 作者: 海尔辛 | 发布时间: 2025-05-19 12:18:38 UTC &#x1f4cb; 目录 PowerShell 管道详解文本搜索与过滤结果限制与选择比较和条件操作符格式化输出对象操作与属性访问错误处理综合实例与最佳实…...

【QT】一个界面中嵌入其它界面(二)

以下是使用 QStackedWidget 实现动态切换界面的完整代码&#xff0c;包含详细的注释和实现步骤&#xff1a; 完整代码 1. 子界面类&#xff1a;Page1 和 Page2 首先创建两个简单的子界面类&#xff0c;用于嵌入到 QStackedWidget 中。 // Page1.h #ifndef PAGE1_H #define P…...

前端的面试笔记——HTMLJavaScript篇(二)前端页面性能检测

前端页面性能检测和判定是优化用户体验的核心环节&#xff0c;需要结合实验室数据&#xff08;Lab Data&#xff09;、现场数据&#xff08;Field Data&#xff09;和行业标准综合评估。以下是主流方法、工具及判定标准的详细解析&#xff1a; 一、性能检测的核心维度与指标 …...

FD+Mysql的Insert时的字段赋值乱码问题

方法一 FDQuery4.SQL.Text : INSERT INTO 信息表 (中心, 分组) values(:中心,:分组); FDQuery4.Params[0].DataType : ftWideString; //必须加这个数据类型的定义&#xff0c;否则会有乱码 FDQuery4.Params[1].DataType : ftWideString; //ftstring就不行&#xff0c;必须是…...

论坛系统(中-2)

软件开发 实现业务功能 个人中心 页面结构介绍 个人中心的页面结构分为三部分 1> 导航栏 2> 正文部分 3> 页脚部分 index.html 的页面结构 1> 导航栏 2> 正文部分 3> 页脚部分 获取用户信息 实现逻辑 ⽤⼾提交请求&#xff0c;服务器根据是否传⼊I…...

火山 RTC 引擎9 ----集成 appkey

一、集成 appkey 1、网易RTC 初始化过程 1&#xff09;、添加头文件 实现互动直播 - 互动直播 2.0网易云信互动直播产品的基本功能包括音视频通话和连麦直播&#xff0c;当您成功初始化 SDK 之后&#xff0c;您可以简单体验本产品的基本业务流程&#xff0c;例如主播加入房间…...

Protobuf协议生成和使用

知识点一 利用protoc.exe编译器生成脚本文件 //1.打开cmd窗口 //2.进入protoc.exe所在文件夹&#xff08;也可以直接将exe文件拖入cmd窗口中&#xff09; //3.输入转换指令 //protoc.exe -I配置路径 --csharp_out输出路径 配置文件名 //注意&…...

2025年—ComfyUI_关于ComfyUI的零碎小知识

之前有个朋友问我要了一个软件安装包&#xff0c;我分享了网盘链接&#xff0c;过了会儿朋友说解压后点击安装一直提示失败&#xff0c;还发给我报错信息&#xff0c;我从没遇到过&#xff0c;也不知做何解&#xff0c;于是要了截图&#xff0c;看着不对劲&#xff0c;问其在哪…...

用 SamGeo 库实现遥感影像自动分割:从本地 TIFF 到 SHP/GeoJSON 的一站式处理(Python 脚本实现)

背景:地理空间数据处理的智能化转型与 SAM 模型的革新应用 在遥感测绘、城市规划、环境监测等领域,地理空间影像数据的自动化处理一直是提升效率的核心需求。传统的影像分割方法依赖人工标注或复杂的参数调优,难以应对海量卫星 / 无人机影像的快速分析;而栅格数据(如 Geo…...

Excel导入校验

校验监听器 /*** Excel 校验监听器* param <T>*/ public class AnalysisValidReadListener<T> extends AnalysisEventListener<T> {private static final Logger logger LoggerFactory.getLogger(AnalysisValidReadListener.class);private static final i…...

【批量图片查找】在电脑上如何根据文件名清单一次性查找多张图片并复制到指定文件夹,基于Python的解决方案

一、应用场景 这个工具适用于以下场景&#xff1a; 设计师需要从大量素材中筛选特定图片复制并保存摄影师需要根据文件名批量整理照片查找筛选复制电商运营人员需要从产品库中提取特定商品图片复制到指定文件夹数据分析师需要批量收集特定图片复制保存用于处理任何需要从大量图…...

湖北理元理律师事务所观察:债务服务中的“倾听者价值”

在债务纠纷解决过程中&#xff0c;法律专业能力与心理支持同样重要。调研显示&#xff0c;72%的债务人在咨询初期存在“隐瞒真实负债”“抗拒沟通”等行为&#xff0c;直接影响方案有效性。湖北理元理律师事务所通过服务模式创新&#xff0c;尝试破解这一难题。 建立信任的三大…...

GPT-4.1特点?如何使用GPT-4.1模型,GPT-4.1编码和图像理解能力实例展示

几天前&#xff0c;OpenAI在 API 中推出了三个新模型&#xff1a;GPT-4.1、GPT-4.1 mini 和 GPT-4.1 nano。这些模型的性能全面超越 GPT-4o 和 GPT-4o mini(感觉这个GPT-4.1就是GPT-4o的升级迭代版本)&#xff0c;主要在编码和指令跟踪方面均有显著提升。还拥有更大的上下文窗口…...

网络工程师案例分析

✅ Huawei Super VLAN 通信规则总结 &#x1f310; 基本结构 Super VLAN&#xff1a;逻辑 VLAN&#xff0c;承载三层网关&#xff08;VLANIF 接口&#xff09;。 Sub VLAN&#xff1a;实际的用户 VLAN&#xff0c;不配置 IP&#xff0c;仅做二层转发。 &#x1f512; 通信规…...

tcp/ip协议

OSI参考模型 应用层&#xff1a;OSI最高层。确定进程之间通信性质 协议:http:80,https:443,ftp:21,telnet:23,ssh:22,smtp:25,pop3 表示层:处理流经结点的数据编码的表示方式问题&#xff0c;以保证一个系统应用层发出的消息可被另一系统的应用层读出&#xff0c;数据压缩和加…...

小红书的视频怎么保存没有水印(方法分享)

你是不是也经常在小红书上刷到超赞的旅行vlog、美妆教程或美食探店视频&#xff0c;想保存下来慢慢看&#xff0c;却发现下载后总有烦人的水印&#xff1f;别急&#xff01;今天教你一招&#xff0c;3秒轻松保存无水印高清视频&#xff0c;简单又实用&#xff01; 为什么需要无…...

RK3568解码1080P视频时遇到系统崩溃内核挂掉的解决方案

接上篇rk3568。 实际使用 rock_mpp库硬解码时&#xff0c;会遇到解码1080P视频整个系统卡死&#xff0c;内核崩溃的问题。 以下是内核崩溃的日志&#xff0c;下面这句是典型的内核某块驱动挂掉的信息。 [ 292.469580] Unable to handle kernel NULL pointer dereference at…...

C++ —— Lambda 表达式

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 L…...

Keepalived相关配置和高可用

目录 一. Keepalived的工作原理 二. 实现单独的心跳网卡 三. keepalive一些优化 3.1 主从之间加密验证 3.2 修改心跳线发送时间 四. 添加独立日志 五. 抢占模式&#xff0c;非抢占模式&#xff0c;延迟抢占模式 六. 单播地址和多播地址 1. 单播地址&#xff08;Unicast…...

gtest 库的安装和使用

目录 介绍 安装 使用 介绍 官方文档&#xff1a;GoogleTest 入门 |GoogleTest 谷歌测试 gtest 库是谷歌开源的 C测试单元框架&#xff0c;方便我们测试程序的正确性。 安装 sudo apt-get install libgtest-dev 使用 GTest 中的断言的宏可以分为两类&#xff1a; • ASS…...

Python训练营打卡——DAY30(2025.5.19)

目录 模块和库的导入 一、导入官方库 1. 标准导入&#xff1a;导入整个库 2. 从库中导入特定项 3. 非标准导入&#xff1a;导入整个库 二、模块、包的定义 三、使用案例 场景1: main.py 和 circle.py 都在同一目录 场景2: main.py 和 circle.py 都在根目录的子目录 mo…...

Django框架的前端部分使用Ajax请求一

Ajax请求 目录 1.ajax请求使用 2.增加任务列表功能(只有查看和新增) 3.代码展示集合 这篇文章, 要开始讲关于ajax请求的内容了。这个和以前文章中写道的Vue框架里面的axios请求, 很相似。后端代码, 会有一些细节点, 跟前几节文章写的有些区别。 一、ajax请求使用 我们先…...

w~自动驾驶~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法来啦&#xff01; 在自动驾驶系统当中&#xff0c;感知任务是整个自驾系统中至关重要的组成部分。感知任务的主要目标是使自动驾驶车辆能够理解和感知周围的环境元素&…...

LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetCode 131.分割回文串

LeetCode 39. 组合总和 需要注意的是题目已经明确了数组内的元素不重复&#xff08;重复的话需要执行去重操作&#xff09;&#xff0c;且元素都为正整数&#xff08;如果存在0&#xff0c;则会出现死循环&#xff09;。 思路1&#xff1a;暴力解法 对最后结果进行去重 每一…...

C++(2)关键字+数据类型 +数据类型输入

&#xff08;1&#xff09;如下关键字是 不能用于定义变量名和常量名的 &#xff01;。 如int int 这样就会报错 所以注意即可 。 &#xff08;2&#xff09;标识符命名规则 &#xff08;即变量和常量的命名规则&#xff09; 最主要注意 第一个 字符必须是字母或是下划线 —…...

第二道re

题目来源&#xff1a;天狩CTF竞赛平台 Lihuas for 题目提示说是for循环&#xff0c;不管了干吧 先看加没加壳&#xff0c;没有&#xff0c;直接无脑IDAF5 代码功能概述 程序会要求用户输入一个 flag&#xff0c;然后将输入的每个字符与索引值进行异或运算&#xff0c;并将结…...

【C语言内存函数】--memcpy和memmove的使用和模拟实现,memset函数的使用,memcmp函数的使用

目录 一.memcpy的使用和模拟实现 1.1--memcpy的使用演示 1.2--memcpy的模拟实现 二.memmove的使用和模拟实现 2.1--memmove的使用演示 2.2--memmove的模拟实现 三.memset函数的使用 3.1--memset的使用演示 3.2--总结 四.memcmp函数的使用 4.1--memcmp的使用演示 4.2…...