自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Lenn Louis' Scribe

电气工程半道出家的计算机编程爱好者,持续输出C++和Linux开发相关内容。

  • 博客(139)
  • 收藏
  • 关注

原创 机器人上的DPDK使用思考

高效数据传输:确保机器人各个部件(如传感器、执行器、控制器等)之间的数据传输具有极低的延迟,以满足实时控制的需求。支持高速数据传输,以满足高清视频、大量传感器数据等多媒体信息的实时传输需求。可扩展:通信协议和接口应采用模块化设计,便于根据具体需求进行定制和扩展。确保通信方案能够与不同类型的机器人部件、传感器和执行器兼容,同时支持未来可能引入的新技术和设备。多协议支持:支持多种通信协议(如CAN、Ethernet/IP等),以满足不同应用场景下的通信需求。

2024-09-20 22:20:44 1267

原创 spdlog的使用

");!!");();!");!!");!");!!");!");!!");!");!!");!");!!");!");!!

2024-09-20 09:54:48 271

原创 边缘智能-大模型架构初探

在成功提交了开发者自定义的这个字符串之后,Token 的值 会保存到服务器后台。只有服务器和客户端前端知道这个字符串,于是 Token 就成了这两者之间的 密钥,它可以让服务器确认请求是来自客户端还是恶意的第三方。每个文件都有一个唯一的 MD5 值(比如 2bf8170b42cc7124b04a8886c83a9c6f),就好比每个人的指 纹都是唯一的一样,效验 MD5 就是用来确保文件在传输过程中未被修改过。Token 的中文有人翻译成 “令牌”,意思就是,你拿着这个令牌,才能过一些关卡。

2024-09-18 20:22:40 1376

原创 FastDFS架构和原理

缺点是 group 的容量受单机存储容量的限制,同时当 group 内有机器坏掉时,数据恢复只能依赖 group 内地其他机器,使得恢复时间会很长。Tracker 是 FastDFS 的协调者,负责管理所有的 storage server 和 group,每个 storage 在启动后会连接 Tracker,告知自己所属的 group 等信息,并保持周期性的心跳,tracker 根据 storage 的心跳信息,建立 group==>[storage server list]的映射表。

2024-09-18 14:13:58 504

原创 Linux如何做ssh反向代理

SSH反向代理是一种通过SSH协议实现的安全远程访问方式,它允许客户端通过SSH连接到一台具有公网IP的代理服务器,然后这台代理服务器再将请求转发给内部网络中的目标主机。

2024-09-07 21:58:30 516

原创 CentOS 8FTP服务器

FTP(文件传输协议)是一种客户端-服务器网络协议,允许用户在远程计算机之间传输文件。这里有很多可用于Linux的开源FTP服务软件,最流行最常用的FTP服务软件有 PureFTPd, ProFTPD, 和 vsftpd。在本教程中,我们将在CentOS 8[4]上安装vsftpd(非常安全的Ftp守护程序)。这是一个稳定,安全且快速的FTP服务器。我们还将向您展示如何配置vsftpd以限制用户访问其主目录,以及如何使用SSL / TLS加密数据传输。

2024-09-07 21:55:23 1141

原创 服务器模型 Reactor 和 Proactor

Proactor 的所有 IO 操作都交给系统提供的异步 IO 接口去执行。Reactor 模式是处理并发 IO 必将常见的一种模式,用于同步 IO,中心思想是将所有要处理的 IO 事件都注册到一个中心 IO 多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有 IO 事件到来回事准备就绪,多路复用器返回并将事先注册的相应 IO 事件分发到对应的处理器中。在 Reactor 模式中,一个单独的线程(通常称为主循环或事件循环)负责处理所有的输入输出事件,并通过事件分发器将这些事件分派给相应的处理器。

2024-09-06 15:06:02 1280

原创 Linux网络编程IO管理

网络 IO 涉及到两个系统对象,一个是用户空间调用 IO 的进程或者线程,一个是内核空间的内核系统,比如发生 IO 操作read。

2024-09-06 09:31:15 1972

原创 MySQL复习4

触发器(trigger)是 MySQL 提供给程序员和数据分析员来保证数据完整性的一种方法,他是与表时间相关的特殊存储过程,他的执行不是由程序调用,也不是手动启动,而是由事件来触发,比如当时对一个表进行。在下订单的时候,对应的商品的库存量要相应减少,即买几个商品就减少多少个库存量。客户修改订单数量,在原来购买数量的基础上减少 2 个;用来表示将要或已经被删除的源数据;用来表示将要或已经被修改的原数据,用来表示将要或已经修改为的新数据;)时就会激活他执行。

2024-09-04 23:00:13 563

原创 Nginx源码阅读1-内存池

/ 清理函数void *data;// 存储的数据// 下一个自定义清理函数结构// 申请自定义清理模块内存} else {// 回调函数初始化为null// 输出日志return c;

2024-09-04 22:57:28 616

原创 Linux内核源码-USB驱动分析

通用串行总线(USB)主要用于连接主机和外部设备(协调主机和设备之间的通讯),USB 设备不能主动向主机发送数据。USB 总线采用拓扑(树形),主机侧和设备侧的 USB 控制器(Host 和 UDC),每个总线只要一个主机控制器。主机侧的 USB 节点为根节点,所有子节点都连接在根节点集线器(Root hub)上,根节点有 USB 主机控制器(USB Host Controller)控制。结构体类型标识一个 USB 设备。USB 是一种总线,而连接到总线上 USB 设备可以是块设备、字符设备、输入设备等。

2024-09-03 23:23:36 606

原创 MySQL复习3

通过视图,我们可以查看基表的部分数据。视图数据来自定义视图的查询中使用的表,使用动态图动态生成。)是一种虚拟存在的表,是一个逻辑表,本省没有数据,内容由查询定义。基表:用来创建视图的表叫做基表。

2024-09-03 23:08:19 585

原创 MySQL复习2

在内联的基础上保留左边表上没有对应关系的记录。在内联的基础上保留右边表上没有对应关系的记录。多行子查询返回多行记录的子查询。取两张表有对应关系的记录。

2024-09-02 19:27:27 1433

原创 MySQL复习1

为了建立冗余较小,结构合理的数据库,设计数据库时必须遵循一定的规则。想要设计一个结构合理的关系型数据库,必须满足一定的范式。数据会以增删改查的方式在数据库中更新处理操作,要求实施性强,稳定性高,确保数据及时更新。当数据积累到一定程度,我们需要对过去发生的事情做一个总结,就需要将过去一段时间产生的数据拿出来统计分析,获取我们需要的信息。例如某个表中有一个地址字段,如果需要经常访问地址字段中的城市属性,则需要将该字段拆为多个字段,省份、城市、详细地址等。包括:DQL,DML,DDL,DCL 和 TCL。

2024-09-02 19:24:22 978

原创 Linux常用命令详解

注意上面的示例2,awk首先是读取一行,分隔后的数据填入$0,$1,$2等变量中才开始进行条件判断和执行动作。如果有一个100万行的文件,要在第100行加某些文字,此时由于文件太大,不适合用vim处理。相比于sed常用于一整行的处理,awk则比较倾向于将一行分成数个“字段”来处理。因此,相当适合小型的数据处理。下图为tcp回射服务器,客户端分别键入"hello"和“world”时,使用tcpdump抓取到的数据包。修改资源限制只会对当前终端环境有效,如果想永久生效,可以修改文件。,该文件的内容如下;

2024-08-25 21:09:54 787

原创 QChart绘制折线图

下面是主窗口类MainWindow的类定义(省略了Action和界面组件的槽函数定义)。在文件重需要包含QtChart,并使用宏导入命名空间。Q_OBJECTpublic:private:// 当前序列// 当前坐标轴// 创建图表// 更新数据// 从图表更新到界面private:在MainWindow类中定义了两个私有的变量,curSeries用于指向当前的序列,界面上对序列的设置操作都是针对当前选择的序列;curAxis用于指向当前的QValueAxis。

2024-08-25 20:39:26 778

原创 USB设备驱动代码分析(鼠标)

这段代码是用于定义一个 USB 鼠标设备的 ID 表。它使用了 Linux 内核中的结构,其中包含了 USB 设备的类、子类和协议信息。这个ID表定义了USB接口,其类别为HID(Human Interface Device),子类别为BOOT(表示鼠标设备),协议为MOUSE(表示鼠标协议)。这个表示在Linux内核的USB驱动中使用,可以匹配对应类型的USB设备,并进行相应的操作。在最后添加一个空结构表示结束符。

2024-08-24 19:54:25 1204

原创 QtChart1-基础入门

Qt Charts模块是一组易于使用的图标组件,它基于Qt的架构,其核心组件是QChartView和QChart。QChartView的父类是,就是架构中的视图组件,所以,QChartView是用于显示图标的视图。QChart的继承关系如图:可以看到,QChart是从继承而来的,所以,QChart是一种图形像。是用于绘制极坐标图的图表类,它从QChart继承而来。想要使用Qt Charts模块,必须在项目的配置文件重添加模块。

2024-08-24 05:09:21 850

原创 C++的拷贝构造,拷贝复制和析构

之前的Complex类没有写拷贝构造和拷贝赋值函数,编译器会加上默认的。要不要重写拷贝构造和拷贝赋值函数,就要看默认的那一套够不够用。如果是带有指针的类,用默认的那一套,会有很大的问题。

2024-08-21 21:55:12 502

原创 Linux源码阅读笔记-USB设备驱动架构

USB系统主机端提供为4个引脚的A型接口,USB外围设备通过4个引脚的B型接口和主机端连接。那4个引脚(一条电压线VBUS、一条地线GND、一条正方向传输数据的D+和一条反方向传输数据的D-线。)USB主机和USB设备收发器可以采用相同型号的芯片。每个端点可以沿上行方向发送数据,也可以沿下行方向接收数据。寻址:USB设备里面每个寻址单元称为端点。为每个端点分配的地址称为端点地址。每个端点地址都与之相关的传输模式。USB传输模式:控制传输模式,中断传输模式,登时传输模式,批量传输模式。

2024-08-21 21:52:21 539

原创 设计模式-模版方法

定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些步骤。Template Method模式是一种非常基础的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Templater Method的典型应用。

2024-08-20 21:49:36 904

原创 设计模式-工厂方法

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。Factory Method模式解决“单个对象”的需求变化。

2024-08-20 21:48:56 418

原创 Protocol Buffer详解

特点:原始内存中的数据结构可以二进制形式发送/保存,那么接收端要和发送端的内存模型、字节序等待保持一致。且扩展性不好。XML:XML占用大量空间,对它进行编码/解码会给应用程序带来巨大的性能损失。容易扩展,使得兼容之前的版本。但是在修改.proto文件时需要满足几个条件field_numrequiredfield_numfield_numfield_num如果满足这些条件,那么就能轻松的实现版本之间的兼容性。对于旧版本的代码,旧的版本会忽略掉新增的字段,而被删除的 optional。

2024-08-19 23:17:58 920

原创 PCI驱动代码分析

修订ID(revision ID):修订ID(Revision ID)是PCI设备的一个标识符,用于指示设备的版本或修订级别。类别ID(class ID):类别ID(Class ID)是PCI设备的一个标识符,用于指示设备所属的设备类别。每个PCI设备都有一个唯一的类别ID,它定义了该设备的功能和特征。设置驱动函数:使用pci_set_drvdata()函数将pci_mcard指针保存在设备结构体dev的私有数据字段中,以便后续在其他驱动程序调用时可以方便地获取。禁用 PCI 设备,防止进一步访问设备。

2024-08-19 14:23:05 604

原创 DKDP用户态协议栈-kni

KNI的原理是将用户空间和内核空间之间的数据传输最小化,以降低网络处理的延迟和开销。在我们使用多线程对同一张arp表进行读取和写入的时候,不可避免的带来了线程安全的问题。为了防止死锁带来的问题,这里我们在插入arp的时候设置锁,解决线程安全的问题。内核回写:如果需要将修改后的数据包发送出去,应用程序可以通过KNI接口将数据包写回内核网络协议栈,并选择相应的物理网卡进行发送。抓包可以看到,在我们开启了混杂模式之后,内核是可以接收到icmp的数据包的,所以证明我们的kni启动其实是没有问题的。

2024-08-18 21:22:15 694

原创 Epoll的实现原理

Epoll是Linux IO多路复用的一种IO管理机制。内核的实现代码在Linux内核源码的中。是比select和poll更高性能的一种IO管理机制。

2024-08-18 21:21:05 1152

原创 Linux的动态库和静态库

直接将动态库放到系统的动态库中,很不安全,因此可能会覆盖重名的系统库。更加安全的方式是通过。注意: 这个方案是临时的,用于测试使用,想要永久生效,使得系统在搜索环境变量之前搜索这个路径。

2024-08-17 20:38:42 746

原创 DPDK用户态协议栈-KNI

KNI的原理是将用户空间和内核空间之间的数据传输最小化,以降低网络处理的延迟和开销。在我们使用多线程对同一张arp表进行读取和写入的时候,不可避免的带来了线程安全的问题。为了防止死锁带来的问题,这里我们在插入arp的时候设置锁,解决线程安全的问题。内核回写:如果需要将修改后的数据包发送出去,应用程序可以通过KNI接口将数据包写回内核网络协议栈,并选择相应的物理网卡进行发送。抓包可以看到,在我们开启了混杂模式之后,内核是可以接收到icmp的数据包的,所以证明我们的kni启动其实是没有问题的。

2024-08-17 20:34:36 530

原创 C++虚拟成员-虚函数

一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被正确调用。当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

2024-08-12 19:42:48 780

原创 C++新特性-智能指针

的正确使用场景是那些资源如果可能就使用,如果不可使用则不用的场景,它不参与资源的生命周期管理。例如,网络分层结构中,Session 对象(会话对象)利用 Connection 对象(连接对象)提供的服务工作,但是 Session 对象不管理 Connection 对象的生命周期,Session 管理 Connection 的生命周期是不合理的,因为网络底层出错会导致 Connection 对象被销毁,此时 Session 对象如果强行持有 Connection 对象与事实矛盾。里的对象管理也是采用这个。

2024-08-12 19:40:44 1163

原创 设计模式-单一职责模式

并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。只实现后四个函数,前三个却不想实现,因为假设在不同平台只是后面的四个函数操作不同,前面三个一致。使功能的拓展变化导致的影响最低?在上图2中,新拓展的功能类没有直接继承相对应的父类,而是通过加入一个。,因为这些类使用相同的函数,但是面向对象不同,因此可以有一个虚基类。设,二级子类(图中第二层的类)有n个,三级子类有m个,那么共需要。这个案例中,变化的是那些扩展的功能,不变的。,在后续的功能扩展中,在运行时再决定扩展。

2024-08-11 23:06:29 1154

原创 协程(coroutine)的原理和使用

一个程序要真正运行起来,需要两个因素:可执行代码段、数据。CPU这些数据内容,我们一般将其称为 “上下文” 或者 “现场”。有栈协程的原理,就是从线程的上下文下手,如果把线程的上下文完全改变,即:改变寄存的内容,指向其他指令地址;改变线程栈的内存内容等等。这样的话,当前线程运行的程序也就完全改变了,是一个全新的程序。协程的实现分为有栈和无栈的方式,有栈的实现方式又是可以分为“独立栈” 和 "共享栈"的实现方式。

2024-08-11 22:59:18 346

原创 HTTP协议和运行原理

HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。不仅仅适用于[服务器客户端]也是适用于[服务器服务器]

2024-08-10 22:31:13 1132

原创 cmake基于语法和应用

CMake。

2024-08-10 22:26:54 946

原创 Memcheck错误解释

Memcheck这两种错误类型,足以应对大多数的情况。下面针对这两种类型出现的错误进行解释。这表示程序在读取/写入一段Memcheck应该操作的内存。本错误提示中,程序在地址0x109C71读取了一个字节,在程序中的地址是。mallocC++newchar由于没有对::malloc分配的内存进行初始化就使用了,就会导致这个错误。其他的的使用没有初始化的变量也会产生这个问题。即,次数多于malloc/new。char用valgrind得到的错误报告就有new[]deletenew/malloc。

2024-08-08 23:24:57 579

原创 Linux源码阅读笔记20-PCI设备驱动详解

【代码】Linux源码阅读笔记20-PCI设备驱动详解。

2024-08-08 23:23:47 711

原创 计算机网络-传输层

网络层不具有重传,需要传输层来控制。TcpUDPDNS。

2024-08-07 22:36:49 907

原创 关于“八股文”在程序员面试中的角色及其对工作实际效用的讨论

关于“八股文”在程序员面试中的角色及其对工作实际效用的讨论,确实是一个值得深入探讨的话题。这里,“八股文”通常指的是面试中常见的一系列标准化问题和答案,涵盖了编程语言基础、算法、数据结构、设计模式、框架知识等,这些内容往往通过记忆和背诵来准备。

2024-08-07 22:32:28 286

原创 大学生的编程道路

对于大学新生来说,入门编程确实是一个既激动又充满挑战的过程。面对琳琅满目的编程语言和丰富的学习资源,制定一个明确且有效的学习路径至关重要。

2024-08-07 22:30:40 238

原创 AI时代程序员的核心竞争力

因此,专注于某个领域或技术栈,成为该领域的专家,是程序员保持竞争力的关键。在AI时代,特别是随着AIGC(人工智能生成内容)和大语言模型如ChatGPT、Midjourney、Claude等的快速发展,程序员确实面临着前所未有的机遇与挑战。:AI工具擅长处理大量数据和执行重复性任务,但在面对复杂、非结构化的问题时,人类的直觉、判断力和创造力仍然无可替代。因此,提升问题解决能力,学会如何分析问题、设计解决方案并有效沟通,是程序员在AI时代的重要技能。:技术日新月异,尤其是在AI领域。

2024-08-07 22:28:30 184

基于Qt的Windows网络嗅探器

基于Qt的网络嗅探器,使用了一些flatui。 使用Winpacp库,支持IPV4,IPv6,ICMP,ARP等网络数据包抓取。 有配套文章。 使用QtCreator环境,pro文件组织工程。 开发不易,收取少量积分。

2024-07-21

C++的gRPC资源包

C++的grpc库和使用方法,配合文章使用。

2023-08-24

空空如也

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

TA关注的人

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