- 博客(124)
- 收藏
- 关注
原创 Kafka 消息队列基础知识与 librdkafka 实践指南
Apache Kafka 是一个分布式流处理平台,最初由 LinkedIn 开发,后开源。消息队列:解耦生产者和消费者持久化存储:消息写入磁盘,可配置保留时间分布式:天然支持集群和水平扩展高吞吐:轻松达到百万级 msg/slibrdkafka 是 Kafka 的C/C++ 客户端库,由 Confluent 维护。高性能:单实例可达百万 msg/s零拷贝:减少内存拷贝开销线程安全:内部管理 I/O 线程支持完整的 Kafka 协议场景建议单进程内的线程间通信继续使用。
2026-03-03 17:35:06
324
原创 Docker 从零开始:一篇文章带你搞懂容器化技术
默认的 Bridge 网络下,容器之间只能用 IP 互访。创建自定义子网后,同一子网内的容器可以直接用容器名称互相访问# 创建子网# 启动容器并加入子网# 此时 web 容器内可以直接用 "db" 作为主机名访问 mongo# 不同子网之间默认互相隔离🎯核心要点回顾Docker = 轻量级容器化技术:比虚拟机更快、更小、更高效镜像是模板,容器是实例:一个镜像可以创建无数个容器docker run是最重要的命令:掌握-d-p-v-e四个核心参数数据持久化靠挂载卷。
2026-03-03 17:33:36
357
原创 Kafka 存储机制完全指南
当消费组发生变化时,Kafka 需要重新分配"谁消费哪个分区",这个过程叫Rebalance(重新平衡)。比喻:一个班级有 20 名学生(Consumer),打扫 100 间教室(Partition),正常每人 5 间。有学生请假或来了新同学,就需要重新分配。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;Kafka 知识全景图🏗️ 架构。
2026-03-03 17:25:21
454
原创 Kafka 完全入门指南:从零开始理解消息队列与 Kafka
Kafka是 Apache 开源的分布式消息队列系统,由 LinkedIn 开发,专为高吞吐量、分布式、可持久化的场景设计。每秒可处理10万级消息,特别适合大数据场景。
2026-03-03 17:20:44
353
原创 volatile关键字、电子电路基础知识
gcc编译器常用的优化级别有三个:O1一级优化二级优化O3三级优化优化的思想:如果我们在前面已经将这个变量所对应的内存数据读到寄存器中,而当我们再次需要读这个变量所对应内存的数据的时候,编译器认为前面我们已经在寄存器中,存放过值了,为了提高效率,它直接会使用上一次寄存器中的值,而不重新从内存中读值。优化带来的问题:如果内存中的值已经被其他的执行单元(中断处理函数–单片机、裸机或其他线程–操作系统)做了更改,而优化之后的代码每次从寄存器中读值,就会带来寄存器中的值和内存中的值不一致的问题。
2026-02-11 18:00:38
565
原创 Boost C++ 库实战教程:打造高性能即时通讯服务器
boost.asioboost.asio 是一个跨平台的 C++ 网络库。支持同步 IO 和异步IO。同步IO// 将会抛出异常// 这里不会抛出异常异步IOproactor模型详解在:https://www.boost.org/doc/libs/1_82_0/doc/html/boost_asio/overview/core/async.html。reactor 模型中, 相当于 select、poll、epoll。
2026-02-08 10:21:59
1078
原创 IM 即时通讯项目技术解析与问题记录
消息封装:将业务数据字符串msg和消息类型标识msgid打包成SendNode对象队列管理:消息加入_send_que发送队列,保证 TCP 发送顺序,避免多线程竞争异步发送:通过触发异步发送Server把拼成一段二进制流,扔进 TCP 管道Client像接水管一样不断接收数据流存入水桶 (_bufferClient每次看水桶里数据够不够 4 字节(头)?够了就读出长度 LClient再看剩下的水够不够 L(体)?不够就等下次水来。
2026-02-08 10:05:21
541
原创 Qt 即时通讯客户端
结构体用途SearchInfo搜索用户结果好友申请信息AuthInfo好友认证信息FriendInfo好友详细信息UserInfo当前用户信息单条聊天消息聊天消息集合实践说明使用网络通信统一使用大端字节序信号槽跨线程通信Qt 自动处理线程切换,安全可靠智能指针管理内存shared_ptr避免手动管理内存的坑事件过滤器精细控制实现组件级别的事件拦截模块核心知识点单例模式、线程安全、模板元编程TCP 通信粘包处理、TLV 协议、状态机设计气泡绘制。
2026-02-04 16:22:09
593
原创 QT评论区总结
服务端用了cpp中的boost库搭建,对于不同的请求作出响应,调用serve的start创建连接管理,先进行异步接收,然后进行异步读取等操作,然后去处理请求,是get,post请求,利用了LogicSystem逻辑单例类去帮我们处理,在构造之时注册相关内容,由于注册功能需要验证码,这个功能需要用Nodejs中的emailmodule中的senMail函数来实现,当然还需要我们的mysql注册用户信息,redis进行验证码时效性。而我们把这些东西都管理封装Mgr起来,同时,引出连接池相关东东的概念。
2026-02-04 11:33:47
562
原创 ChatServer
现象:偶发 Crash,调用栈指向异步回调内部原因:回调执行时,发起异步操作的对象已被析构// ❌ 错误写法// 危险!此时 CSession 可能已被销毁});// ✅ 正确写法// 引用计数 +1// self 保证 CSession 不会被析构});特性实现方式高并发Boost.Asio 异步 IO + IO 线程池低耦合IO 与业务分离,消息队列解耦可扩展多 ChatServer 实例 + gRPC 跨服通信高可用连接池复用 + 心跳保活 + 优雅退出协议安全。
2026-02-03 11:16:10
617
原创 StatusServer
整个项目代码目录如下:—ChatGrpcClient.h/.cpp 在这个项目这是没有用的—const.h—message.proto以及生成的pb.cc/.h和grpc.pb.cc/.h。
2026-02-02 20:04:23
431
原创 基于 Qt 框架的在线音乐播放器系统
头文件(Header File)是 C++ 类的契约,定义了对象拥有的属性和行为。揭示了播放器的内部构造。Q_OBJECT//...Q_OBJECT宏是 Qt 的魔法所在。它声明该类将使用元对象系统,从而支持信号与槽、属性系统等特性。没有这个宏,信号与槽的连接将无法工作。这个音乐播放器项目虽然代码量不大,但它像麻雀一样“五脏俱全”。它串联起了 GUI 开发、网络编程、数据库应用和多媒体处理四大核心领域。对于初学者,它是理解 Qt 框架“全能性”的绝佳教案;
2026-01-31 16:27:40
651
原创 gRPC(Google 远程过程调用)
一个完整的 RPC 调用流程涉及客户端存根(Stub)、序列化(Marshalling)、网络传输、反序列化(Unmarshalling)及服务端存根(Skeleton)等多个环节。gRPC 的高性能并非黑魔法,而是建立在两大坚实的技术基石之上:高效的二进制序列化协议 Protocol Buffers 和先进的传输层协议 HTTP/2。以下是一个简单的proto文件:在上述定义中, 关键字定义了 RPC 服务的边界,类似于面向对象语言中的接口(Interface)。 关键字定义了传输的数据结构,类似于
2026-01-04 16:03:26
717
原创 jpg格式以及libjpeg库、了解http协议、http协议传输html网页、html协议传输图片、视频流传输
本项⽬中按照简化编程的原则,只对 http 协议的⾸⾏数据进⾏了解析,⽽且⽹⻚客户端发送的 http 请求数据包均使⽤ GET ⽅法,服务器只需要把客户端请求的数据打包发送给服务器就可以了。在上图的框架中,每增加⼀个浏览器 socket 连接就开辟了⼀个线程来处理相应的接收数据,其处理思路就是不断地接收 http 数据包,进⾏分析后,将客户端请求地数据打包成应答包格式发送给客户端。Request-URL 所标识的资源后附加新的数据 HRAD 请求获取由 Request-URL 所标识的资源的响应消息报头。
2025-08-18 12:23:37
773
原创 Ubuntu系统下摄像头的使用,v4l2接口访问摄像头属性、获取一张yuv图片,yuv格式详解、数据转rgb
步骤 1:在虚拟机下使⽤主机的摄像头时,需要将其连接到虚拟机下,步骤是: ⼯具栏–> 虚拟机–>可移动设备–> ⾃⼰电脑的摄像头(例如 Acer Camera)–> 连接 步骤 2:在 Ubuntu 终端下,切换到 root ⽤户,输⼊ cheese,稍等⽚刻后弹出摄像头拍照窗⼝;函数 mmap() 的功能是:把⽂件映射到进程的虚拟内存空间。:能⼒集可以快速判断⽬前的相机设备是否⽀持后续操控,⽐如有的相机只有拍照没有视频功能,有的相机能拍照的同时记录⾳频等等,所以检查相机能⼒是必要的。
2025-08-18 12:09:35
1068
原创 文件传输模块设计
为防⽌ tcp 底层粘包, 在传输⽂件之前先接收协议头信息,在根据协议中的⽂件⼤⼩与⽂件名,在服务器的测试程序中,使⽤多线程的并发服务器,当客户端与服务器建⽴连接后, 会创建⼦线。1. 编写服务器与客户端测试程序,然后在进⾏测试。接收⽂件头,获取⽂件⼤⼩与⽂件名。接收数据, 并将数据写⼊到⽂件中。程来进⾏接收客户端上传的⽂件。将接收的数据写⼊到⽂件中。2. 实现⽂件下载功能。协议设计与接收协议头。协议设计与接收协议头。
2025-08-17 19:57:00
286
原创 udp协议、tcp协议与wireshark抓包分析
ip.addr == 10.226.42.58 && tcp.port == 8888 显示 源 ip 或者⽬的 ip 为 10.226.42.58。ip.addr == 10.226.42.58 || tcp.port == 8888 显示 源 ip 或者⽬的 ip 为 10.226.42.58。udp.port == 8888 显示 udp 源端⼝号或者⽬的端⼝号为 8888 的数据包。tcp.port == 8888 显示 tcp 源端⼝号或者⽬的端⼝号为 8888 的数据包。
2025-08-17 19:56:20
690
原创 文件上传工具基础框架设计与tcp socket封装
现在主流的⽂件上传⼯具⼀般基于 FTP 协议实现,这⾥的上传⼯具主要⽤于强化 tcp socket。上述函数主要对 tcp 服务器的套接字创建,绑定 ip 地址与端⼝号,建⽴监听队列进⾏了封装。⽂件上传⼯具⽤于将⽂件上传到服务器的⼯具, 主要包括客户端程序与服务器程序。step 1 : 创建 tcpsocket.h 与 tcpsocket.c。tcp socket 模块 : 主要封装了 tcp socket 的操作。实现 tcp 客户端 socket 创建与等待连接接⼝设计。⽂件上传⼯具基础框架设计与。
2025-08-17 19:34:25
184
原创 tcp粘包原因分析、解决方案、tcp并发服务器(多进程、多线程)
tcp 粘包 : 使⽤ tcp 协议进⾏数据传输时,** 发送⽅发送的若⼲个数据包到接收⽅接收时粘成。⽅式⼆ : 使⽤数据⻓度 + 数据的⽅式,先接收数据⻓度,再根据⻓度接收数据, 这⾥。step 1 : 发送时,分两次发送,第⼀次发送数据⻓度,第⼆次发送数据。step 2 : 接收时,分两次接收,第⼀次接收数据⻓度,第⼆次接收数据。发送⽅⼀次性发送的数据⼤于 MTU,则会发⽣拆包,将字节流进⾏切⽚分成。当发送⽅的速度⼤于接收⽅的速度时, 在缓冲区中缓存了多个数据包,⼀次性。
2025-08-17 17:08:06
778
原创 tcp客户端实现流程与服务器连接、发送与接收数据、创建套接字、绑定ip地址、tcp服务器实现流程
step 2 : 填写 IP 地址, 要让虚拟机的 ip 地址与 windows ip 地址保持在同⼀个局域⽹类。listen : 建⽴监听队列,并设置套接字的状态为 listen 状态, 表示可以接收连接请求。设计⼀个服务器程序,并和客户端建⽴连接,并打印客户端的 ip 地址和端⼝号。,在实现 tcp 客户端时,则需要先连接服务器,后⾯才能进⾏通讯,socket() : 创建套接字, 使⽤的套接字类型为流式套接字。addr : 连接的套接字的地址结构对象的地址 (⼀般为服务器)
2025-08-17 16:38:26
608
原创 局域网聊天室之整体功能
4. 如果发送的 "quit" 消息,则更新 msg.type = CLIENT_QUIT;msg.type = SERVER_QUIT. // 所有客户端结束,链表清空。4. 填充服务端的 ip 和 port,消息类型,及需要发送的字符。1. 创建⼦线程来发送消息给其他的客户端,传递 parm 参数。1. 主线程,while(1) 循环来接收所有的数据。5. 把消息发送给服务端,然后循环结束。2. 创建⼦线程,⽤于接收服务端发送过来的消息。3. 发送登录消息给服务端,只发送⼀次。
2025-08-17 16:19:14
864
原创 局域网聊天室项目概述、群发服务器设置
局域网聊天室整体代码量较多。客户端和服务器相关代码都比较多。服务端:实现一个服务器群发的功能,服务端设计一个链表,用来存储用户信息,当链表中。创建多线程,把客户端的收发分开。局域网群发服务器的功能,后期在对代码的架构进行扩展。某个用户发送数据的时候,链表中其他用户也可以收到。客户端:发送数据和接收数据应该是异步的。所有登录的用户,需要先发送一个消息,用于接收。协议实现的简单的具有即时信息传输功能的软件。由于此代码为项目的中间架构,此架构目前存在。地址和端口,之后才能收到数据。局域网聊天室之群发服务器设置。
2025-08-17 16:07:21
337
原创 并发服务器之多进程并发
解决的⽅法是服务器(知名端⼝)等待⼀下客户的到来,当⼀个客户到来后,记下其 IP 和 port,然后同理,服务器 fork ⼀个⼦进程,建⽴⼀个 socket 再 bind ⼀个随机端⼝,然后建⽴与客户的连接,并处理该客户的请求。问题在于每个客户都是往服务器端的同⼀个的端⼝发送数据,并⽤的同⼀个 sockfd。并发服务器的每⼀个⼦进程如何正确区分每⼀个客户的数据报(涉及到进程的调度问题,如何避免⼀个⼦进程读取到不该它服务的客户发送来的数据报)。并发服务器是指在同⼀个时刻可以响应多个客户端的请求。
2025-08-17 15:52:22
386
原创 udp通信创建流程、服务器相关api函数
⼤家⾃⼰写⼀个 UDP 发送⽅的代码,按照下列框图要求编写代码,新建⼀个 log.txt 的⽂件,在⽂件中写⼊数据,⽤户读取 log.txt ⽂件的内容,通过 sendto() 发送给⽹络调试助⼿,并通过⽹络测试助⼿接收数据,判断读取的内容是否正确。在函数 socket,recvform,sendto,bind 中选取⼀个⾃⼰熟悉的函数,按照⾃⼰的理解,把英⽂函数接⼝说明翻译为中⽂,并上传。要求读取 log.txt ⽂件的内容,并把⽂件名, ⽂件内容和⽂件内容⼤⼩分别填充到上述结构体中。
2025-08-17 10:33:24
935
原创 消息发布功能实现
服务器接收到消息后, 会进⾏分发处理,最终会通过发布消息函数来进⾏处理,具体接收设计如。step 2 : 将订阅进程的 pid 作为消息类型,在封装消息内容,写⼊到消息队列。当客户端发布消息之后,服务器需要将这个消息转发给订阅这个主题的所有进程。step 1 : 将 msg.h msg.c 拷⻉服务器的⼯程⽬录中。step 1 : 在 server.h 中添加发布消息的处理函数。step 1 : 在 client.h 中添加消息发布接⼝。step 2 : 在 server.c 中添加发布消息接⼝。
2025-08-17 10:08:47
863
原创 消息订阅功能实现
step 2 : 将任务函数添加到线程池中,然后由线程池中的线程来执⾏, 在 runloop 添加相应的代码即可。在任务函数中,服务器根据当前模式进⾏分发, 分为订阅消息处理函数与发布消息处理函数, 这。当服务器接收到数据后,需要将数据以任务函数形式添加线程池中, 并在任务函数中实现相应的。服务器数据接收接⼝主要⽤于接收客户端数据后,将任务分配给线程处理,这⾥主要实现数据。这⾥的数据域是根据项⽬进⾏了定制,主要是保存主题与订阅进程的 id。step 1 : 在 server.h 中添加订阅处理函数的声明。
2025-08-17 09:58:49
692
原创 线程池执行函数、销毁、测试,项目模块整合与数据结构设计
server : 服务器⽬录 (msg 模块与 hashmap 模块在后⾯实现), 需要添加 server.h 与server.c。client : 客户端⽬录 (msg 模块在后⾯实现), 需要添加 client.h 与 client.c。修改 shm.c 创建共享内存的⽂件名为 shm 临时⽂件, 客户端与服务器的 shm 模块要同步。step 3 : 判断是否销毁,如果是销毁,则释放线程互斥锁,并让线程退出。创建两个⽬录,客户端与服务器, 并将相应的模块到对应的⽬录中。编写 Makefile。
2025-08-17 09:48:52
355
原创 线程池原理与框架设计、线程池的数据结构设计、线程池初始化、线程池添加任务
step 2 : 判断任务队列是否已满,如果满了则阻塞在 tp_cond_full 条件变量上。可以创建多个线程,在有任务的时候,则 可以执行任务,在没有任务时,则进入睡眠状态。在处理请求的过程中,需要创建线程与销毁线程,会导致资源的消耗,如何解决。使用多线程并发,将请求的处理分配给线程来完成,处理完成后则退出。线程池在初始化时会创建多个线程,在没有任务时,会进入睡眠状态。这里用户线程与线程池中的线程是生产者与消费者模型。是⽤于在任务队列为满时,阻塞添加任务的线程。step 5 : 初始化任务队列的容量。
2025-08-17 09:32:03
590
原创 项目框架介绍,环形队列设计
如果是发布, 则需要根据主题在 hashmap 中查询到订阅进程的 id,从发布消息进程获。消息发布者 (商家) 在公众号上发布相应的内容,并不关注具体的消息接收者 (消费者)消息发布者负责发布消息,是基于消息主题 (类别) 将发布的内容传输到消息服务器。消息的发布者与消息订阅者解耦,即消息发布者不⽤关⼼订阅者,订阅者也不⽤关⼼。消息订阅者负责接收消息,是基于消息主题 (类别)从消息服务器接收消息。是所有的关注公众号的消息接受者 (消费者) 都可以在公众号中看到消息。
2025-08-17 09:23:11
785
原创 io-poll底层原理分析,io-epoll基本原理与应用、控制与等待、原理分析
应⽤层调⽤ poll 函数,在内核会调⽤ sys_poll, sys_poll 函数定义在内核源码的 fs/select.c ⽂。在 ep_ptable_queue_proc 中 将 ep_poll_callback 回调函数添加到等待队列,驱动最后会关联。在上⾯的函数实现中,在没有⽂件描述符就绪时,会让进程睡眠, 等待 ep_poll_callback 来进。当内存分配好之后,就会将在⽤户空间的传递到内核的 struct pollfd 数组拷⻉到内核的空间中。
2025-08-09 19:45:10
850
原创 io-select、io-poll基本原理与应用
一、进程处理多路请求在没有多路复用IO之前,对于多路IO请求,一般只有阻塞与非阻塞IO两种方式阻塞IO需要结合多进程与多线程每个进程线程处理一路IO缺点客户端越多,需要创建的进程线程越多,相对占用内存资源较多非阻塞IO单进程可以处理,但是需要不断检测客户端是否发出IO请求,需要不断占用cpu,消耗cpu资源二、多路复用简介本质上就是通过复用一个进程来处理多个请求,基本思想如下由内核来监控多个文件描述符是否可以进行I/O操作。
2025-08-09 19:22:54
649
原创 ls命令设计与实现(三、四、五、六)
设计接⼝ get_file_gname 并保存到 struct file_attribute 结构体中。获取⽂件权限与获取⽂件类型的思路⼀致,需要解析 stat 的 st_mode 成员,不同的是解析。具体可以在 show_file_attribute 函数中进⾏打印即可。在 show_file_attribute 函数中进⾏打印。在 get_file_attribute 函数中进⾏调⽤。get_file_last_modify_time 函数。在 get_file_attr 函数中要进⾏分开处理。
2025-08-09 17:43:13
847
原创 cp命令设计与实现(三、四)、ls命令设计与实现(一、二)
获取⽂件类型 是通过解析 struct stat 结构体中的 st_mode 的第 [15:12] bit 来判断。⽂件复制直接采⽤ 标准 io ⼆进制读写函数接⼝,这样可以兼容 ⽂本⽂件与⼆进制⽂件。对于链接⽂件本身需要通过 lstat 函数来获取,否则获取的链接⽂件所指向的⽂件。get_file_type_ls , 将获取的⽂件属性信息保存到结构体相应的成员。如果是第⼆种情形, 源⽂件是⽬录时,则需要复制⽬录中所有的⽂件以及⼦⽬录的内容。step 1 : 遍历⽬录, 并获取⽬录下的⽂件名。
2025-08-09 17:29:02
934
原创 项目框架设计与实现、命令处理框架设计、cp命令设计与实现(一、二)
step 3 : 在主逻辑函数 cmd_cp_execute 中进⾏调⽤ cmd_cp_parse_type。%.o : ⽤于匹配任意 .o ⽂件, 如 cmd_handle.o ,cmd_ls.o ,…%.c : ⽤于匹配任意 .c ⽂件, 如 cmd_handle.c ,cmd_ls.c ,…step 2 : 调⽤ cmd_handle 的 cmd_execute 接⼝执⾏相应的命令。根据⽂件类型进⾏判断,如果是普通⽂件,则直接进⾏复制, 如果是⽬录,则递归复制。
2025-08-09 17:15:07
758
原创 二进制读写与文件定位、静态库和动态库的原理与制作
gcc -I <头⽂件路径> -L < 库的路径 > -l < 动态库的名字 > < 源⽂件 >-o < 可执⾏⽂件名 >gcc -I <头⽂件路径> -L < 库的路径 > -l < 静态库的名字 > -o < 可执⾏⽂件名 >当编译器链接动态库的时候,会在可执⾏⽂件的头信息中记录库的名字,便于在操作系统执⾏。动态库默认加载动态库的路径与链接动态库的默认路径是相同的,都是 /lib 与。当编译器链接静态库的时候,如果在可执⾏⽂件中有调⽤静态库的函数接⼝,则会将。
2025-08-08 20:07:03
502
原创 fopen/fclose、fgetc/fputc、fgets/fputs、格式化输入输出与时间获取
示例 : 以读写⽅式打开⽂件 test.txt,如果该⽂件不存在,则创建. 如果该⽂件已经存在,则⻓度截短为 0.练习: 以读写⽅式打开⽂件 test.txt,如果该⽂件不存在,则报错, 使⽤ r+ 即可.w + 或 w+b 或 wb+ : 打开可读写⽂件,若⽂件存在则⽂件⻓度清为零,即会擦些⽂。w 或 wb : 打开只写⽂件,若⽂件存在则⽂件⻓度清为 0, 即会擦些⽂件以前内容。若⽂件不存在,则会建⽴该⽂件, 如果⽂件存。获取当前时间并转换本地时间,以 %d-%d-%d %d::%d::%d 进⾏打印。
2025-08-08 19:58:14
847
原创 linux io框架、文件io接口、read/write、标准io简介
主要包括 open()/close()/read()/write() /lseek() 相应的系统调⽤ (准确说法是对系统调⽤。应⽤程序通过调⽤ 操作系统提供的 io 接⼝ (函数) 向内核进⾏ io 请求 , 由内核最终完整相应的。系统调⽤是 Linux 内核给⽤户提供的访问接⼝, 但在 glibc 中封装了系统调⽤接⼝⽽形。⽤户层与内核层是相辅相成,⽤户层的应⽤程序依赖于库或者内核, 库与内核给应⽤层提供服务。FILE 指针:每个被使⽤的⽂件都在内存中开辟⼀个区域,⽤来存放⽂件的有关信息,这些信息。
2025-08-08 19:47:13
801
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅