自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 eBPF监听recv()并转发【Linux C】

想象Linux内核是一座戒备森严的城堡│ Linux 系统 ││ │ 用户空间 (城堡外面) │ ││ │ │ 你的程序 │ │ 浏览器 │ │ 终端 │ │ ││ ↕ 系统调用 (城门) ││ │ 内核空间 (城堡内部) │ ││ │ │网络协议栈│ │文件系统 │ │进程调度 │ │ ││ │ │ ││ │ 🤖 eBPF程序 = 你派进城堡的"安全间谍机器人" │ │传统方式:想观察城堡内部?需要重建城堡(修改内核源码、重新编译)eBPF方式。

2026-02-01 22:12:21 718

原创 IOuring的异步写数据从内存到本地【Linux C】

io_uring 是 Linux 内核在 5.1 版本引入,5.6版本改进的一种全新的、异步 I/O 接口。中,在退栈前,我们需要检查提交后的数据是否都完成了。如果拿到数据了,就标记已完成。拿到一个sqe后就可以进行键值对的(异步IO)提交了。方式为:拿到新的数据后,将数据提交到队列中,待到队列满时再提交。最后保存的结果顺序可能与提交时的顺序有出入。,每次写入完成后返回末尾处的指针。保存以数组形式存储的键值对。如果我们想在该提交的数据返回。遍历数组,提交键值对到。使用包管理器快速安装。,那么可以传参过去。

2026-01-31 15:58:15 259

原创 数据结构-跳表【C】

对一个长度为n有序数组,使用遍历法插入、查找一个元素的时间复杂度都为O(n)。我们需要从数组的头部一个个地去比较键的大小。然后我们改进使用二分查找法。判断目标在数组的左半侧还是右半侧。然后更新head和right一格一格地去尝试逼近目标。二分查找是一种分而治之的思路,每次都将搜索范围缩小一半直到范围为1。其时间复杂度为O(logn)return mid;return -1二分查找解决了数组的查找问题,但是其插入和删除还是要移动前n/2或者后n/2的元素,其时间复杂度为O(n)。

2026-01-31 14:55:42 243

原创 数据结构-哈希表【C】

首先我们需要有一个数组,长度为max_slots,数组的每一个元素中是一个HashNode还要有一个哈希函数理想情况下(比如max_slots足够大),每一个data都有一个唯一不会冲突的hash值使用这个hash值作为下角标,那么查询时的时间复杂度为O(1)哈希表中已经存储了count个元素int count;char *key;free(isnt);printf("哈希表申请哈希数组失败\n");return -1;return 0;= NULL){

2026-01-29 14:15:18 573

原创 数据结构-红黑树【C】

红黑树,它首先是一个二叉平衡树。二叉树(一般就指二叉搜索树),它查询的时间复杂度为O(logn)。如果发生了节点一直插在节点的左叶子节点或者右叶子节点上时,那么它搜索的时间复杂就会退化为O(n)。因此我们需要动态地平衡树的左右支,那么就有了二叉平衡树这一概念。红黑树是二叉平衡树中最经典的一种实现方式红黑树中的节点可以分为实节点(data)和虚节点(nil)两种与二叉树不同的是,存储数据的节点都必须拥有叶子节点,若存储数据节点的叶子节点没有data则用nil进行填充①每个节点的是红的或者黑的。

2026-01-29 14:15:06 604

原创 实现KV存储【Linux C】

在协议层我们让KV存储读懂了用户通过网络层发送过来的指令,那么KV存储知道了要干什么后要怎么去实现对应的功能,这就是业务层。例如对于SET kv_name redis,这是新增,我们要操作key-value存储的数据结构的add,GET kv_name这是查询,我们要操作key-value存储的数据结构的check,MOD kv_name redis,这是修改,我们要操作key-value存储的数据结构的update。同时考虑到一个产品的后续迭代,我们应该怎样设计整个工程的结构方便我们后续升级?

2025-11-22 19:17:34 387

原创 网络编程异步IO【Linux C IOuring】

基于这样一种理念,IOuring的作者为linux内核新增了三个系统调用io_uring_setup,io_uring_enter,io_uring_register。在Posix API提供的一系列网络编程接口中比如,recv(),send(),他们的本质都是把实现了网络通信的协议栈中存储的数据,copy到了用户态提供的buffer,在这个过程中我们可以选择他是阻塞式读取还是非阻塞式读取。recv()和send()是同步的,因为用户在使用这两个结构和内核收发消息的时候是一种你等我,我等你的关系。

2025-11-22 17:11:17 644 1

原创 reactor的解析与实现【Linux C epoll】

,recv(fd…) 这些函数,关注的是fd对应的IO(或者连接)是否可读或者可写,这样很难做进一步的开发。所以我们需要epoll去代替我们关注什么时候这些IO可读可写,我们要做的就只是往里面传数据。reactor 是一种事件驱动的设计模式,通过一个 / 多个 “反应器”(Reactor)监听 IO 事件,触发对应的回调(callback),从而实现了IO 操作与业务逻辑的异步分离,大大提高开发效率。在mainloop中我们要做的就是让epoll不断地去检测是否有IO就绪,epoll就不在这里多说了。

2025-11-18 17:59:45 896

原创 Linux开发环境配置总结【Ubuntu22 VScode Mobaxterm】

最近在学习linux环境下的C/C++开发,因为是初学者,所以遇到了许多有关环境配置,而不是代码该怎么写的问题。趁网络编程学习阶段结束,在这里做一个总结,后续遇到问题也要添加和修改。

2025-11-14 11:31:07 780

原创 mysql对一张图片进行读、写操作【Linux C】

在Linux系统上要下载mariaDB来使用mysql。②根据传入的mysql句柄初始化statement(②根据传入的mysql句柄初始化statement(这个包,最终编译的时候还要说明加入对应的的头文件。⑤对于一个大文件,在execute前需要使用。绑定 stmt SQL语句 SQL语句长度。告诉客户端库 “准备接收分块的长二进制数据。绑定 stmt SQL语句 SQL语句长度。④判断是否写入成功并销毁fp。,一次读一Bytes,读。④判断是否读取成功并销毁。,一次写一Bytes,写。

2025-11-04 10:34:19 255

原创 基于UDP编程的DNS协议解析与实现【C】

是互联网的一项服务,用于域名和IP的映射。我们可以向DNS服务器发出请求,例如发送域名www.baidu.com,向本地DNS服务器(运营商提供)会返回这个域名对应的IP地址,同一个域名可能有多个,动态的IP地址。返回结果:第一项是DNS服务器的信息第二项是服务器根据域名返回IP地址在浏览器的地址栏键入这两个ip都可以访问到百度。

2025-11-04 10:34:07 407

原创 线程与线程池【C】

第二个参数是 const pthread_attr_t* 类型,用于设置线程的属性(如栈大小、优先级、分离状态等)。线程池的创建完成后就要执行任务 注意在线程池中,可能创建了线程但没有任务,所以创建完不是要去执行任务,而是要去检查是否有任务。②主线程和子线程共享进程的全局资源(如全局变量、堆内存、文件描述符等),但各自拥有独立的栈空间(局部变量不共享)第四个参数是第四个参数是 void* 类型,用于传递给线程入口函数 thread_callback 的参数。且main函数启动的线程为这些线程的父线程。

2025-11-03 20:46:01 621

原创 HTTP客户端请求【C】

HTTP,英文全称是一个基于TCP/IP协议的服务器和本地浏览器传输数据的协议。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

2025-11-03 20:45:51 310

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除