- 博客(71)
- 收藏
- 关注
原创 【Linux | C++】GDB调试教程详解
Debug 版本和Release 版本。这两个版本在编译和构建时的设置不同,主要用于不同的目的。Debug 版本Debug 版本是为调试程序而构建的版本。它包含了额外的调试信息,可以帮助程序员在程序执行时观察和分析程序的内部状态。调试信息:编译时会生成调试信息(如变量名、行号等),以帮助调试工具(如 GDB)进行源代码级别的调试。优化关闭:通常会关闭编译优化,以便程序员可以准确地跟踪代码的执行流程和变量的变化。性能:由于缺少优化和额外的调试信息,Debug 版本通常运行较慢,性能较差。编译选项。
2024-10-27 11:51:17
2025
1
原创 ubuntu18.04中如何设置桥接模式和静态ip
桥接模式将虚拟机的网络接口直接连接到物理网络接口。虚拟机就像是网络中的一个独立计算机,拥有自己的 IP 地址。
2024-10-27 11:50:44
1139
原创 【C++ | 数据结构】八大常用排序算法详解
排序是我们生活中经常会面对的问题,小朋友站队的时候会按照从矮到高的顺序排列;老师查看上课出勤情况时,会按照学生的学号点名;高考录取时,会按照成绩总分降序依次录取等等。那么对于排序它是如何定义的呢? 排序是将一批无序的记录(数据)根据关键字重新排列成有序的记录序列的过程。 在工作和编程过程中我们经常接触的有八种经典的排序算法分别是: 关于排序还有另一个大家需要掌握的概念就是排序的稳定性。排序的稳定性指的是在排序算法中,如果两个元素的键值相等,排序后它们的相对顺序是否会保持不变。在选
2024-10-27 11:49:16
1083
原创 【Linux | 网络I/O模型】五种网络I/O模型详解
模型发起 I/O 请求等待 I/O 操作处理结果特点阻塞 I/O发起请求阻塞等待完成处理结果简单易懂,但效率低非阻塞 I/O发起请求立即返回(检查状态)处理结果轮询方式,效率较高I/O 多路复用发起请求等待事件发生处理已就绪事件高效处理多个 I/O 操作信号驱动式 I/O发起请求等待信号处理信号避免轮询,编程复杂异步 I/O发起请求继续执行其他任务处理结果(回调或通知)高效处理大量并发操作。
2024-10-26 23:29:15
1249
1
原创 【Linux | IO多路复用】epoll的底层原理详解
epoll是一种高效的 I/O 多路复用机制,广泛用于 Linux 系统中,用于处理大量并发的文件描述符。它比传统的select和poll方法具有更好的性能,特别是在处理大量并发连接时。
2024-10-26 23:28:37
1451
原创 【C++ | 设计模式】观察者模式的详解与实现
当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。这个模式在现实生活中非常常见,比如新闻订阅、社交媒体的推送通知等。举个简单的例子想象一下,你订阅了一个YouTube频道。当这个频道发布新视频时,你就会收到通知。这就是观察者模式的一个实际应用。YouTube频道相当于“被观察者”,你作为订阅者则是“观察者”。
2024-09-01 21:14:48
1478
原创 【C++ | 设计模式】代理模式的详解与实现
学校附近的各种代理点很多:“办卡、办卡,动感地带月租只要 18 啦”、“充值、充值,充 100 送 50”。它通过引入代理对象,间接地操作目标对象,从而实现对目标对象的控制。代理模式的核心思想是通过代理对象来控制对目标对象的访问。Proxy(代理):持有一个 RealSubject 引用(指针),可以在需要时将请求转发给 RealSubject,以此起到代理的作用。这里,代理模式可以理解为:移动公司把充值的职责托付给代理点,代理点代替移动公司充值,客户直接与代理点打交道,而非移动公司。
2024-09-01 21:13:55
1420
原创 【C++ | 设计模式】工厂方法模式的详解与实现
工厂模式基本和简单工厂模式差不多,简单工厂模式 - 在产品子类添加时,需要添加一个判断分支,这违背了开放-封闭原则。ConcreteFactory(具体工厂):实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且被应用程序调用以创建产品对象。Product(抽象产品):所创建对象的基类,也就是具体产品的共同父类或共同拥有的接口。:当需要创建不同类型的产品对象,并且这些产品对象具有相似的接口时,可以使用工厂方法模式。:当系统需要依赖于产品的接口,而不是具体的实现时,可以使用工厂方法模式。
2024-08-29 21:53:26
888
原创 【C++ | 设计模式】简单工厂模式的详解与实现
他们是驰名世界的汽车企业,也被认为是高档汽车生产的先导,最可怕的是均属于德国制造。简单工厂模式的实质是。它是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。由于工厂类集中了所有产品的创建逻辑(违反了高内聚责任分配原则),职责过重,一旦无法正常工作,整个系统都将受到影响。客户端无需关心具体产品如何创建与组织,仅需知道具体产品所对应的参数即可,可以在一定程度减少使用者的记忆量。
2024-08-28 22:01:24
601
原创 【C++ | 设计模式】单例模式的详解与实现
单例模式(Singleton Pattern)是设计模式中最简单的形式之一,其目的是。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时。这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象。
2024-08-28 21:59:10
1335
原创 【Linux C++】log4cpp日志库的安装和使用详解
log4cpp是一个开源的 C++ 日志库,灵感来源于 Java 的log4j。它提供了灵活的日志记录功能,可以帮助开发者在 C++ 应用程序中记录、管理和格式化日志信息。log4cpp支持多种日志记录策略和输出目标,可以满足各种不同的需求。
2024-08-27 22:06:26
1682
原创 ubuntu中安装Mysql以及使用Navicat远程连接的详细步骤【图文教程】
建议大家都安装的版本,在该版本下再安装版本的数据库。1查看当前是否安装了MySQL程序执行以上命令,如果执行后什么都没有,则进入到MySQL的安装步骤2如果执行以上命令,显式如下,就证明MySQL已经安装完毕,直接使用MySQL即可。3执行以下命令安装MySQL安装完成后,MySQL服务会自动启动4使用如下命令检查MySQL的状态至此,你已经成功的安装好了MySQL服务器。
2024-08-27 22:05:22
1110
1
原创 【Linux C | 网络编程】进程池退出的实现详解(五)
上一篇中讲解了在进程池文件传输的过程如何实现零拷贝,具体的方法包括使用mmap,sendfile,splice等等。这篇内容主要讲解进程池如何退出。
2024-07-28 23:05:40
1131
原创 【Linux C | 网络编程】进程池零拷贝传输的实现详解(四)
上一篇解决了进程池中进行大文件传输的问题,通过循环接收和发送指定大小的内容实现大文件的可靠传输。但是其中不可避免的在循环中使用多次的send和recv,这就涉及到多次从内核缓冲区到用户缓冲区的切换,这其中就会增加文件传输的耗时。为了减少这些不必要的系统开销,可以使用一些零拷贝的技术,提升文件传输的效率。
2024-07-27 19:00:03
887
原创 【Linux C | 网络编程】进程池大文件传输的实现详解(三)
上一篇实现了进程池的小文件传输,使用自定义的协议,数据长度+数据本身,类似小火车的形式,可以很好的解决TCP“粘包”的问题。当文件的内容大小少于小火车车厢的时候,上述代码的表现是非常完美的。但是如果一旦文件长度大于火车车厢大小,那么上述代码就无能为力了。那么当传出大文件的时候有哪些办法呢?
2024-07-27 16:59:11
1147
原创 【Linux C | 网络编程】进程池小文件传输的实现详解(二)
上一篇实现了一个最基本的进程池:客户端读取标准输入,发送给服务端,服务端回复一个相同的内容。这篇内容在上篇进程池的基础上实现小文件的传输。文件传输的本质实现上和cp命令的原理是一样:应用程序需要打开源文件并且进行读取,然后将读取得到的内容写入到目标文件当中。如果是远程上传/下载文件,则需要将前述流程分解成两个应用程序,应用程序之间使用网络传输数据。
2024-07-26 22:41:24
1059
原创 【Linux C | 网络编程】简易进程池的实现详解(一)
进程池(Process Pool)是一种并发编程的模型,用于管理和复用多个进程,以提高系统的效率和性能。它主要解决的问题是减少因频繁创建和销毁进程而带来的性能开销,特别是在需要处理大量并发任务时尤为有效。
2024-07-26 21:41:34
963
原创 【Linux C | 网络编程】进程间传递文件描述符socketpair、sendmsg、recvmsg详解
我们的目的是,实现进程间传递文件描述符,是指 A进程打开文件fileA,获得文件描述符为fdA,现在 A进程要通过某种方法,传递fdA,使得另一个进程B,获得一个新的文件描述符fdB,这个fdB在进程B中的作用,跟fdA在进程A中的作用一样。即在 fdB上的操作,即是对fileA的操作。可能很多人想到的是用管道pipe来实现,但是却没想象的那么容易。
2024-07-25 21:39:32
1385
原创 Linux网络编程-libevent的使用详解【C语言】
是一个开源的事件通知库,主要用于开发高性能的事件驱动应用程序,特别适用于网络服务器的开发。它提供了跨平台的抽象接口,使得开发人员可以利用事件驱动的方式处理网络和文件描述符的异步 I/O 操作。
2024-07-23 22:07:33
1300
原创 使用UDP套接字编程详解【C语言】
UDP(User Datagram Protocol,用户数据报协议)是一种面向无连接的传输层协议,用于在计算机网络上发送数据。它与 TCP(Transmission Control Protocol,传输控制协议)相比具有轻量、高效的特点,但牺牲了可靠性和顺序传输的保证。udp的通信过程默认也是阻塞的。
2024-07-23 20:16:27
1166
原创 epoll水平触发(Level Triggered)和边缘触发(Edge Triggered)详解
如果监听套接字和通信套接字都被设置成了ET模式,那么程序就会在accept和recv处阻塞,因为ET模式下当有事件触发时只会通知一次,解决办法是把这两种套接字都是设置成非阻塞。这样就可以避免在这两处位置阻塞。一般情况下,监听套接字不需要设置成ET模式,只需要把通信套接字设置成ET模式即可,但是accept函数需要放到一个循环中。思考题?epoll监控监听文件描述符可以设置成ET模式吗??
2024-07-22 16:08:36
2736
原创 IO多路复用-epoll的使用详解【C语言】
IO多路复用是一种通过一种机制使一个进程能同时监控多个文件描述符的状态变化的技术。它通过操作系统提供的机制,让单个线程能够有效管理多个IO操作,如读取、写入等,而不需要创建多个线程或进程来处理每个IO事件。这种技术在网络编程中特别有用,可以显著提高服务器的并发处理能力和响应速度。在Linux系统中,常见的IO多路复用机制有selectpoll和epoll。其中,epoll由于其高效的特性,成为了主流的选择。
2024-07-22 11:22:57
1742
原创 IO多路复用-poll的使用详解【C语言】
poll是一种用于监控多个文件描述符状态的系统调用,它可以等待多个文件描述符上的事件发生。它与select和epoll类似,但在某些场景下使用更为方便。
2024-07-21 13:21:21
1009
原创 IO多路复用-select的使用详解【C语言】
IO多路转接也称为IO多路复用,它是一种网络通信的手段(机制),通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的,一旦检测到有文件描述符就绪( 可以读数据或者可以写数据)程序的阻塞就会被解除,之后就可以基于这些(一个或多个)就绪的文件描述符进行通信了。通过这种方式在单线程/进程的场景下也可以在服务器端实现并发。常见的IO多路转接方式有:select、poll、epoll。
2024-07-21 13:21:08
1333
原创 使用多进程和多线程实现服务器并发【C语言实现】
如果需要和发起新的连接请求的客户端建立连接,那么就必须在服务器端通过一个循环调accept()函数,另外已经和服务器建立连接的客户端需要和服务器通信,发送数据时的阻塞可以忽略,当接收不到数据时程序也会被阻塞,这时候就会非常矛盾,被accept()阻塞就无法通信,被read()阻塞就无法和客户端建立新连接。
2024-07-20 14:43:50
1588
原创 TCP粘包问题详解和解决方案【C语言】
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输协议,它保证了数据的可靠性和顺序性。然而,由于TCP是基于字节流而不是消息的,因此在传输过程中可能会出现粘包(Packing)和拆包(Unpacking)问题。**粘包问题(TCP粘包现象)**指的是发送方在传输数据时,TCP协议把多个发送的小数据包“粘”在一起,形成一个大的数据包发送;或者接收方在接收数据时,多个小的数据包被“粘”在一起,形成一个大的数据包接收。
2024-07-20 14:43:24
6637
1
原创 TCP滑动窗口和流量控制详解
窗⼝的实现就是操作系统开辟的⼀个缓存空间,发送⽅主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。每发送⼀个数据,都需要⼀次应答,然后继续发送,这样为每个数据包都进⾏确认应答,缺点是:数据往返时间越⻓,⽹络吞吐量越低。):是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号,也就是 #2 的第一个字节。:也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号,也就是 #3 的第一个字节。发送⽅发送的数据⼤⼩不能超过接收⽅的窗⼝⼤⼩,否则接收⽅就⽆法正常接收到数据。
2024-07-19 21:09:56
1370
原创 TCP状态转换详解
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中,连接的状态会随着不同阶段的通信而发生变化,这些变化被称为状态转换。在TCP进行三次握手,或者四次挥手的过程中,通信的服务器和客户端内部会发送状态上的变化,发生的状态变化在程序中是看不到的,这个状态的变化也不需要程序猿去维护,但是在某些情况下进行程序的调试会去查看相关的状态信息,先来看三次握手过程中的状态转换。
2024-07-19 16:07:51
1519
原创 使用tcpdump 和 Wireshark进行简单TCP抓包分析【图文教程】
和都是网络分析工具,用于捕获和分析网络数据包,但它们在功能和使用上有所不同。所以,这两者实际上是搭配使用的,先用 tcpdump 命令在 Linux 服务器上抓包,接着把抓包的文件拖出到 Windows 电脑后,用 Wireshark 可视化分析。如果你是在 Windows 上抓包,只需要用 Wireshark 工具就可以。
2024-07-19 11:20:49
2761
1
原创 TCP重传机制详解
在TCP中,当发送端的数据到达接收主机时,接收端主机会返回⼀个确认应答消息,表示已收到消息。但是如果传输的过程中,数据包丢失了,就会使⽤重传机制来解决。TCP的重传机制是为了保证数据传输的可靠性而设计的一系列机制,它主要通过重新发送丢失或确认失败的数据段来确保数据能够正确地到达接收方。
2024-07-18 21:09:16
1125
原创 TCP三次握手与四次挥手详解
表示发送端端口号,字段长 16 位,2个字节表示接收端端口号,字段长 16 位,2个字节序号(sequence number):字段长 32 位,占4个字节,序号的范围为 [0,4284967296]。由于TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号首部中的序号字段则是指本报文段所发送的数据的第一个字节的序号,这是随机生成的。序号是循环使用的,当序号增加到最大值时,下一个序号就又回到了0确认序号(acknowledgement number)
2024-07-18 17:10:30
1263
原创 高并发服务器-使用多线程(Multi-Thread)实现【C语言】
在上期的socket套接字的使用详解中()最后实现的TCP服务器只能处理一个客户端的请求发送,当有其他客户端请求连接时会被阻塞。为了能同时处理多个客户端的连接请求,本期使用多线程的方式来解决。
2024-07-17 17:56:41
711
原创 高并发服务器-使用多进程(Multi-Process)实现【C语言】
初始化服务器创建监听套接字(socket绑定套接字到指定地址和端口(bind开始监听连接请求(listen等待连接进入一个无限循环,等待并接受客户端连接(accept创建子进程每当接受到一个新的客户端连接,创建一个子进程(fork子进程负责与客户端通信,处理请求并发送响应。父进程继续监听父进程关闭与客户端通信的套接字,继续监听新的连接请求。处理子进程结束信号(可选)注册信号处理函数,处理子进程结束信号,避免僵尸进程。
2024-07-17 17:26:14
537
原创 TCP/IP网络模型详解
在计算机网络领域,网络模型通常指的是 OSI(Open Systems Interconnection)参考模型或 TCP/IP(Transmission Control Protocol/Internet Protocol)模型。这些模型描述了网络中数据传输的层次结构,便于理解和设计网络系统。
2024-07-17 14:55:09
3377
原创 Linux网络编程-socket套接字使用详解
UDP发送方初始化套接字,得到文件描述符;UDP接收方初始化套接字,得到文件描述符;UDP接收方调用bind,将套接字绑定在指定的IP地址和端口;UDP发送方调用sendto发送数据到接收方的地址和端口;UDP接收方调用recvfrom接收数据;UDP接收方处理请求并调用sendto发送响应数据到发送方;UDP发送方调用recvfrom接收响应数据;通信结束后,发送方和接收方分别调用close关闭套接字。
2024-07-16 22:48:02
1158
原创 Linux多线程编程-哲学家就餐问题详解与实现(C语言)
状态记录:每位哲学家有三种状态:思考、饥饿和进餐。互斥保护:使用互斥锁保护对状态的访问,确保状态变化的原子性。信号量:使用信号量控制每根筷子的使用,确保每位哲学家能同时拿到左右两根筷子。我们用一个数组 state 来记录每一位哲学家的三个状态,分别是在进餐状态、思考状态、饥饿状态(正在试图拿叉子)。那么,一个哲学家只有在两个邻居都没有进餐时,才可以进入进餐状态。第i个哲学家的左邻右舍,则由宏LEFT和RIGHT定义:LEFTRIGHT比如 i 为 2,则LEFT为 1,RIGHT为 3。
2024-07-14 16:23:17
944
原创 Linux多线程编程-生产者与消费者模型详解与实现(C语言)
生产者-消费者模型是并发编程中的经典问题,描述了多个线程(或进程)如何安全、有效地共享有限的缓冲区资源。:负责生成数据或者将数据放置到共享缓冲区中。:负责从共享缓冲区中取出数据并进行处理或消费。
2024-07-14 14:55:20
1016
原创 Linux系统编程-线程同步详解
是指多个线程协调工作,以便在共享资源的访问和操作过程中保持数据一致性和正确性。在多线程环境中,线程是并发执行的,因此如果多个线程同时访问和修改共享资源,可能会导致数据不一致、竞态条件(race condition)等问题。线程同步通过协调线程的执行顺序和共享资源的访问来避免这些问题。:多个线程可能同时访问和修改共享的数据或资源,如果没有同步机制,可能会导致数据不一致或损坏。:竞态条件是指多个线程以不受控制的顺序访问共享资源,从而导致程序执行结果不确定的情况。通过同步机制可以避免竞态条件的发生。
2024-07-13 18:37:37
1132
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人