- 博客(31)
- 收藏
- 关注
原创 实现Linux平台自定义协议族
我们常常在Linux系统中编写socket接收TCP/UDP协议数据,大家有没有想过它怎么实现的,如果我们要实现socket接收自定义的协议数据又该怎么做呢?带着这个疑问,我们一起往下看吧~~//ops: 指向一个描述套接字协议族的 net_proto_family 结构体。这个结构体定义了://协议族编号(family),比如 AF_INET(IPv4)或 AF_INET6(IPv6)。//与此协议族关联的 create 函数,用于创建套接字。
2024-11-29 22:02:27 432
原创 Linux 网络--TCP协议收包流程(NAPI机制)
通过对网络收包过程的梳理,让我们对Linux网络数据包的流转有一定的概念,在需要分析源码的时候能找到对应位置进行分析。
2024-07-09 22:54:33 944 1
原创 循环buffer“一写多读“
”一写多读“循环buffer即一个写者往循环buffer缓冲区写入数据,多个读者从循环buffer缓冲区读取数据,通过管理各种读写指针的位置进行数据保护。通过这种机制实现一份数据共享给不同模块使用且互不干扰,隔离模块,降低耦合。
2024-05-28 22:50:33 901
原创 提高编程效率的技巧与实践
提高C语言编码效率是一个多方面的工作,它涉及到对硬件特性的理解以及对代码的精心设计。通过应用缓存局部性原理、优化CPU分支预测、重构代码和选择高效算法,我们可以显著提升程序的性能。希望本文能帮助你在C语言编码过程中提高效率。如果你有任何疑问或想要了解更多提高效率的技巧,请在评论区留言。👋。
2024-05-12 22:24:39 1014 1
原创 了解一下Linux系统提供的写时复制机制--COW!
传统的操作系统创建子进程时候,便会给子进程分配对应的内存空间,将所有的资源复制给子进程,这样会导致创建子进程效率低下,不够灵活。Linux系统在创建子进程的设计上采用了写时复制机制(Copy On Write)巧妙的避免了上面的问题。:创建子进程时不复制整个父进程的地址空间,而是共享父进程的地址空间,此时父进程的内存设置为只读模式,当父进程或子进程发生写内存时候,则触发页异常中断,为子进程分配的物理页并复制数据(此时其他内存页可能还处于共享状态,只有发生。
2024-04-18 23:13:57 218
原创 C 语言实现泛型的单链表--支持任意元素类型
Linux内核源码剖析(一)--不同寻常的双向链表),利用用户自定义的结构体包含 Linux 内核双链表节点,通过结构体元素偏移找到用户结构体起始位置,实现一种“泛型”链表。不过今天小 C 分享的是另外一种实现思路,请往下看~
2024-03-27 22:34:23 683 1
原创 TCP Nagle 算法:网络优化的双刃剑
在广域网(WAN)中,频繁发送小数据包可能会导致网络拥塞,因为每个小数据包都需要单独的确认(ACK),这增加了网络的负载。Nagle 算法的核心思想是,在一个 TCP 连接上,最多只能有一个未被确认的小数据包(小于 MSS,即最大报文段大小)在网络中。如果有未确认的数据,且新数据可以与未确认的数据合并(即新数据的大小加上未确认数据的大小小于 MSS),则将新数据添加到未确认数据的末尾。如果新数据不能与未确认数据合并,且未确认数据已收到 ACK,那么发送未确认数据和新数据。
2024-02-23 21:08:31 873 1
原创 TCP Time-Wait状态:网络通信中的“等待”艺术
Time-Wait状态是TCP协议中一个精巧的设计,它在保证数据传输可靠性的同时,也带来了一些挑战。了解并合理管理Time-Wait状态,可以帮助我们更好地优化网络应用,提升用户体验。在网络通信的世界里,每一个细节都值得我们深入探究。实际的TCP连接管理可能涉及更复杂的机制和优化策略。在实际应用中,应根据具体场景和需求进行调整。
2024-02-21 21:03:33 486
原创 一文快速掌握CPU中SPM与NUMA架构!
一般来说,一个CPU插槽对应一个 Node。需要注意的一个特点是,CPU访问本地内存和远程内存耗时差别较大,因此NUAM架构的系统设计程序时,要考虑尽量避免或少访问远程内存,这样才能发挥NUMA CPU架构的优势,否则性能可能大打折扣,一般常用的处理方式是线程绑核操作。
2024-01-14 21:54:37 565
原创 用 C 语言编写设计模式--单例模式 (log日志文件的实现)
单例模式是一种属于对象创建型的模式,即保证系统中类只生成一个对象。这个是一个十分常用的设计模式,比如系统中只初始化一次的资源,如 socket、log 日志文件等,能被多个线程访问,保证其有唯一 1 个实列存在,作为全局变量供其他地方访问,同时也避免重复资源被初始化操作带来错误。简而言之,就是对一个一次性资源的封装,避免被重复申请或初始化,然后作为一个全局变量被访问。单例模式有如下几个特点:1.确保该资源只被申请或初始化一次 2.定义静态对象指针 3.提供一个函数,全局访问👀。
2023-06-11 20:34:20 1357 2
原创 用 C 语言编写设计模式--策略模式
策略模式 (Strategy)也叫是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy 模式主要用来平滑地处理算法的切换。
2023-06-11 20:29:06 907
原创 用 C 语言实现有限状态机 FSM--基于表驱动
打电话流程测试图如下,通过输入进行触发事件,最开始是空闲,输入2拨号,触发拨号事件,进入拨号态,输入2接通接通电话,进入通话态,输入0接收通话,挂断电话,回到空闲态。可结合状态转换图一起看,更清晰。3. 有限状态机有四个点: 事件、当前状态、相应的动作、下一个状态,把这四个特性封装进结构体,建成一个表(结构体数组),循环遍历数组,根据事件触发,取出满足条件的状态项并执行对应动作函数。接电话流程测试图如下,输入1触发响铃事件,进入响铃态,输入2接通电话,进入通话态,输入0结束通话,挂断电话,回到空闲态。
2023-06-11 20:25:47 2773 5
原创 用 C 语言编写设计模式--模板模式
在抽象类中统一操作步骤,并规定好接口;让子类实现接口。这样可以把各个具体的子类和操作步骤解耦合虽然C语言是面向过程的编程语言,但是我们在设计程序的时候,可以考虑用面向对象的方式去设计,这样提高我们程序的“高内聚、低耦合”特性,便于维护。需要C语言实现设计模式代码的小伙伴:在微信公众号【Linux编程用C】后台回复 【designer】 即可获取,不断更新中!欢迎大家加小C微信【LinuxCodeUseC】,我们一起交流讨论学习!PS:若大家想看C语言版本的其他设计模式,转发!关注吧!~~
2023-06-11 20:20:13 357
原创 用C语言实现适配器模式!
也叫适配器模式,是构造型模式之一,通过 Adapter模式可以改变已有类(或外部类)的接口形式。是将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。提高代码的复用度、灵活性高目标角色(Target):客户端期望的接口,抽象类或接口适配者角色(Adaptee):已存在接口,但是和客户端期望的接口不一致适配器角色(Adaper):适配器,将适配者角色现有的接口进行适配,满足目标角色。
2023-06-11 20:15:00 414
原创 C语言实现设计模式--装饰模式!
本篇小C将带领大家来了解学习装饰模式,该模式也是日常开放中使用较多的模式。1. 装饰(Decorator)模式:又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。2. 装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地按顺序地使用装饰功能包装对象。3.装饰模式的使用场景需要扩展一个类的功能,或给一个类增加一个附加的功能;需要动态地给一个对象增加功能。4.UML类图装饰类。
2023-06-11 17:14:28 249
原创 用 C 语言实现一个静态代理模式 !
5.代理模式的类图如下,我们作为client使用时,直接访问interface这个抽象接口,真实的RealSubject与Proxy代理类继承该interface抽象接口,并实现接口定义函数。2.所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。1.通过上面的测试结果,我们可以了解到,真正干活的还是服装店,不过加上代理模式后,整个销售流程更加完善,功能更加丰富。实际开放中,代理模式可以。
2023-06-11 17:12:33 267
原创 用C语言实现原型模式!
使用 student 的 clone()函数克隆一个相同数据的对象赋值给 Interface 统一接口,直接打印信息,此时打印的信息与原始对象即 student 的信息一样的,因为其是克隆来的。例如:资源优化场景,一个模块(对象)的初始化需要消耗很大资源,这个资源包括数据、硬件等资源等,然后我们通过拷贝并修改特定的数据来减少重复初始化对象所消耗的资源与时间。虽然C语言是面向过程的编程语言,但是我们在设计程序的时候,可以考虑用面向对象的方式去设计,这样提高我们程序的“高内聚、低耦合”特性,便于维护。
2023-06-11 17:05:31 194
原创 用 C 语言编写建造者模式!
通过上面的内容,我们了解到建造者模式主要是针对创建对象的过程的,而且还可以控制一个复杂类中部件创建的顺序以及部件创建的内容。以建造房子为例,房子有公寓、别墅、楼房等类型,虽然是不同种类的房子,但其建造过程大体上都相同,例如都有这些流程:修建墙、窗户、门、地板、楼顶等。,但是具体实现却不同,所以我们需要把实现这些组建的操作给抽象出来,把每个部件实现了,然后再组装起来,修建的房子就完成了。比较:与工厂模式进行对比,工厂模式不考虑对象部件组装过程,直接生成一个最终的对象,强调的是。
2023-06-11 17:00:35 164
原创 【无标题】
原型模式 prototype,是一种 创建型模式 ,它采用复制原型对象的方法来创建对象的实例,具有与原型一样的数据。原型对象自身创建一个目标对象,通过prototype模式创建的对象与原始对象具有相同的数值。即拷贝原始对象的数据。主要解决的是:"某些结构复杂的对象"的创建工作,由于需求的变化,
2023-03-22 23:09:27 70
原创 【无标题】
建造者模式: 也称生成器模式,是23种设计模式中的一种,是一种创建型模式。适用情况:一个对象比较复杂,将一个对象的构建和对象的表示进行分离。比较:与工厂模式进行对比,工厂模式不考虑对象部件组装过程,直接生成一个最终的对象,强调的是结果。而建造者模式先构建对象的每一个部件,然后再统一组建成一个对象,强调的是过程。目的:实现复杂对象的生产流程与部件进行解耦。通过上面的内容,我们了解到建造者模式主要是针对创建对象的过程的。而且还可以控制一个复杂类中部件创建的顺序以及部件创建的内容。
2023-03-22 23:06:26 82
原创 【无标题】
1.代理模式,是构造型的设计模式之一,是一个使用率比较高的模式,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问。2.所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。3.代理模式也叫做委托模式,在日常的应用中,代理模式可以提供非常好的访问控制。4.代理模式的优点: 职责清晰、高扩展性。
2023-03-22 23:00:29 105
原创 用C语言实现简单工厂模式!
虽然C语言是面向过程的编程语言,但是我们在设计程序的时候,可以考虑用面向对象的方式去设计,这样提高我们程序的“高内聚、低耦合”特性,便于维护。
2023-03-12 16:49:45 540
原创 给自己的程序写一个插件
插件!我相信大家都不陌生吧,但是大家有没有想过插件是怎么做的呢?为什么程序已经打包发布了,但加入插件又可以动态增加新的功能。比如wirehark这款网络抓包软件,我们就可以编写插件,解析自定义的协议。
2023-03-07 22:41:18 3021
原创 C语言中,通过malloc()函数申请的内存,free()函数释放内存,只传入一个地址,为什么能知道释放多大的内存?
绿色方框中的buffer1头部信息如图4所示,只有一个0x31的值,其他都是0,0x31(十进制: 49), 49 = 32 + 16 +1,32字节是我们malloc()函数申请的大小,16字节是头部信息大小,还有1字节的偏移,所以free()函数拿到这块地址,根据头部信息才能正确的释放内存。图5绿色方框是buffer2的内存块头部信息,有一个值0x51(十进制:81),81=64 + 16 + 1,64字节是我们使用malloc()函数申请的大小,16字节是内存块头部信息,1字节的偏移。
2023-03-04 18:08:44 888
原创 C语言版本的循环buffer比C++版本的速度更快!测试500M数据0.5秒,达9.25Gbps左右!
使用随机生成一个500M的源数据文件,开启两个线程,一个线程从数据文件中随机长度读取数据,然后往循环buffer里面写数据,一个线程从循环buffer里面随机长度读取出数据,然后写入文件,最后使用。速率:注意,测试速率时候把read_data_task线程函数的写文件给注释了,因为我们测的速率只是循环buffer接口的性能。中实现了C++版本的循环buffer,这次分享一个C语言版本的循环buffer,程序设计逻辑与上一个版本完全一致,只是改用了C语言并通过函数指针进行封装。接下来直接进入正题--
2023-03-04 17:56:06 683 1
原创 一个简单实用的循环buffer,用于缓冲数据!测试500M数据,耗时1.3秒。
使用随机生成一个500M的源数据文件,开启两个线程,一个线程从数据文件中随机长度读取数据,然后往循环buffer里面写数据,一个线程从循环buffer里面随机长度读取出数据,然后写入文件,最后使用。循环buffer,即环形缓冲区,设有固定的大小,被定义成一个环形,新数据会覆盖旧的数据,减少内存拷贝,提高程序的性能。如图2所示,当我们要写入数据时,我们会关注写指针的位置,还有能写入的空间,图中的白色与黄色区域均是可以写入数据的,黄色区域已经读取了数据,即可被覆盖。现在可以写入的数据大小即是黄色的区域。
2023-02-26 19:46:09 726 1
原创 Ubuntu18 SSH VScode连接失败,报错connection to host key verification failed
Ubuntu18 SSH VScode连接失败,报错connection to host key verification failed
2023-01-07 15:56:42 373
原创 C++中格式化字符串 stringstream的使用
我们在C语言中常常使用sprintf()对数据格式化到字符串中,那在c++中我们使用的是stringstream这个类进行格式化。需要包含头文件#include 。
2022-08-07 18:10:05 641
原创 C语言内存使用问题 malloc(): memory corruption: 0x00007f3494014240 ***
c语言 malloc函数 内存申请使用
2022-05-02 11:48:40 2905
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人