自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 epoll水平触发(Level Triggered)和边缘触发(Edge Triggered)详解

如果监听套接字和通信套接字都被设置成了ET模式,那么程序就会在accept和recv处阻塞,因为ET模式下当有事件触发时只会通知一次,解决办法是把这两种套接字都是设置成非阻塞。这样就可以避免在这两处位置阻塞。一般情况下,监听套接字不需要设置成ET模式,只需要把通信套接字设置成ET模式即可,但是accept函数需要放到一个循环中。思考题?epoll监控监听文件描述符可以设置成ET模式吗??

2024-07-22 16:08:36 394

原创 IO多路复用-epoll的使用详解【C语言】

IO多路复用是一种通过一种机制使一个进程能同时监控多个文件描述符的状态变化的技术。它通过操作系统提供的机制,让单个线程能够有效管理多个IO操作,如读取、写入等,而不需要创建多个线程或进程来处理每个IO事件。这种技术在网络编程中特别有用,可以显著提高服务器的并发处理能力和响应速度。在Linux系统中,常见的IO多路复用机制有selectpoll和epoll。其中,epoll由于其高效的特性,成为了主流的选择。

2024-07-22 11:22:57 683

原创 IO多路复用-poll的使用详解【C语言】

poll是一种用于监控多个文件描述符状态的系统调用,它可以等待多个文件描述符上的事件发生。它与select和epoll类似,但在某些场景下使用更为方便。

2024-07-21 13:21:21 581

原创 IO多路复用-select的使用详解【C语言】

IO多路转接也称为IO多路复用,它是一种网络通信的手段(机制),通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的,一旦检测到有文件描述符就绪( 可以读数据或者可以写数据)程序的阻塞就会被解除,之后就可以基于这些(一个或多个)就绪的文件描述符进行通信了。通过这种方式在单线程/进程的场景下也可以在服务器端实现并发。常见的IO多路转接方式有:select、poll、epoll。

2024-07-21 13:21:08 874

原创 使用多进程和多线程实现服务器并发【C语言实现】

如果需要和发起新的连接请求的客户端建立连接,那么就必须在服务器端通过一个循环调accept()函数,另外已经和服务器建立连接的客户端需要和服务器通信,发送数据时的阻塞可以忽略,当接收不到数据时程序也会被阻塞,这时候就会非常矛盾,被accept()阻塞就无法通信,被read()阻塞就无法和客户端建立新连接。

2024-07-20 14:43:50 952

原创 TCP粘包问题详解和解决方案【C语言】

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输协议,它保证了数据的可靠性和顺序性。然而,由于TCP是基于字节流而不是消息的,因此在传输过程中可能会出现粘包(Packing)和拆包(Unpacking)问题。**粘包问题(TCP粘包现象)**指的是发送方在传输数据时,TCP协议把多个发送的小数据包“粘”在一起,形成一个大的数据包发送;或者接收方在接收数据时,多个小的数据包被“粘”在一起,形成一个大的数据包接收。

2024-07-20 14:43:24 855

原创 TCP滑动窗口和流量控制详解

窗⼝的实现就是操作系统开辟的⼀个缓存空间,发送⽅主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。每发送⼀个数据,都需要⼀次应答,然后继续发送,这样为每个数据包都进⾏确认应答,缺点是:数据往返时间越⻓,⽹络吞吐量越低。):是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号,也就是 #2 的第一个字节。:也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号,也就是 #3 的第一个字节。发送⽅发送的数据⼤⼩不能超过接收⽅的窗⼝⼤⼩,否则接收⽅就⽆法正常接收到数据。

2024-07-19 21:09:56 1063

原创 TCP状态转换详解

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。在 TCP 连接的生命周期中,连接的状态会随着不同阶段的通信而发生变化,这些变化被称为状态转换。在TCP进行三次握手,或者四次挥手的过程中,通信的服务器和客户端内部会发送状态上的变化,发生的状态变化在程序中是看不到的,这个状态的变化也不需要程序猿去维护,但是在某些情况下进行程序的调试会去查看相关的状态信息,先来看三次握手过程中的状态转换。

2024-07-19 16:07:51 1194

原创 使用tcpdump 和 Wireshark进行简单TCP抓包分析【图文教程】

和都是网络分析工具,用于捕获和分析网络数据包,但它们在功能和使用上有所不同。所以,这两者实际上是搭配使用的,先用 tcpdump 命令在 Linux 服务器上抓包,接着把抓包的文件拖出到 Windows 电脑后,用 Wireshark 可视化分析。如果你是在 Windows 上抓包,只需要用 Wireshark 工具就可以。

2024-07-19 11:20:49 829 1

原创 TCP重传机制详解

在TCP中,当发送端的数据到达接收主机时,接收端主机会返回⼀个确认应答消息,表示已收到消息。但是如果传输的过程中,数据包丢失了,就会使⽤重传机制来解决。TCP的重传机制是为了保证数据传输的可靠性而设计的一系列机制,它主要通过重新发送丢失或确认失败的数据段来确保数据能够正确地到达接收方。

2024-07-18 21:09:16 659

原创 TCP三次握手与四次挥手详解

表示发送端端口号,字段长 16 位,2个字节表示接收端端口号,字段长 16 位,2个字节序号(sequence number):字段长 32 位,占4个字节,序号的范围为 [0,4284967296]。由于TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号首部中的序号字段则是指本报文段所发送的数据的第一个字节的序号,这是随机生成的。序号是循环使用的,当序号增加到最大值时,下一个序号就又回到了0确认序号(acknowledgement number)

2024-07-18 17:10:30 1191

原创 高并发服务器-使用多线程(Multi-Thread)实现【C语言】

在上期的socket套接字的使用详解中()最后实现的TCP服务器只能处理一个客户端的请求发送,当有其他客户端请求连接时会被阻塞。为了能同时处理多个客户端的连接请求,本期使用多线程的方式来解决。

2024-07-17 17:56:41 589

原创 高并发服务器-使用多进程(Multi-Process)实现【C语言】

初始化服务器创建监听套接字(socket绑定套接字到指定地址和端口(bind开始监听连接请求(listen等待连接进入一个无限循环,等待并接受客户端连接(accept创建子进程每当接受到一个新的客户端连接,创建一个子进程(fork子进程负责与客户端通信,处理请求并发送响应。父进程继续监听父进程关闭与客户端通信的套接字,继续监听新的连接请求。处理子进程结束信号(可选)注册信号处理函数,处理子进程结束信号,避免僵尸进程。

2024-07-17 17:26:14 390

原创 TCP/IP网络模型详解

在计算机网络领域,网络模型通常指的是 OSI(Open Systems Interconnection)参考模型或 TCP/IP(Transmission Control Protocol/Internet Protocol)模型。这些模型描述了网络中数据传输的层次结构,便于理解和设计网络系统。

2024-07-17 14:55:09 995

原创 Linux网络编程-socket套接字使用详解

UDP发送方初始化套接字,得到文件描述符;UDP接收方初始化套接字,得到文件描述符;UDP接收方调用bind,将套接字绑定在指定的IP地址和端口;UDP发送方调用sendto发送数据到接收方的地址和端口;UDP接收方调用recvfrom接收数据;UDP接收方处理请求并调用sendto发送响应数据到发送方;UDP发送方调用recvfrom接收响应数据;通信结束后,发送方和接收方分别调用close关闭套接字。

2024-07-16 22:48:02 933

原创 内存对齐详解【C语言】

1.2.3.4.5.67891011121314151617。

2024-07-16 14:03:29 143

原创 Linux多线程编程-哲学家就餐问题详解与实现(C语言)

状态记录:每位哲学家有三种状态:思考、饥饿和进餐。互斥保护:使用互斥锁保护对状态的访问,确保状态变化的原子性。信号量:使用信号量控制每根筷子的使用,确保每位哲学家能同时拿到左右两根筷子。我们用一个数组 state 来记录每一位哲学家的三个状态,分别是在进餐状态、思考状态、饥饿状态(正在试图拿叉子)。那么,一个哲学家只有在两个邻居都没有进餐时,才可以进入进餐状态。第i个哲学家的左邻右舍,则由宏LEFT和RIGHT定义:LEFTRIGHT比如 i 为 2,则LEFT为 1,RIGHT为 3。

2024-07-14 16:23:17 577

原创 Linux多线程编程-生产者与消费者模型详解与实现(C语言)

生产者-消费者模型是并发编程中的经典问题,描述了多个线程(或进程)如何安全、有效地共享有限的缓冲区资源。:负责生成数据或者将数据放置到共享缓冲区中。:负责从共享缓冲区中取出数据并进行处理或消费。

2024-07-14 14:55:20 455

原创 Linux系统编程-线程同步详解

是指多个线程协调工作,以便在共享资源的访问和操作过程中保持数据一致性和正确性。在多线程环境中,线程是并发执行的,因此如果多个线程同时访问和修改共享资源,可能会导致数据不一致、竞态条件(race condition)等问题。线程同步通过协调线程的执行顺序和共享资源的访问来避免这些问题。:多个线程可能同时访问和修改共享的数据或资源,如果没有同步机制,可能会导致数据不一致或损坏。:竞态条件是指多个线程以不受控制的顺序访问共享资源,从而导致程序执行结果不确定的情况。通过同步机制可以避免竞态条件的发生。

2024-07-13 18:37:37 1040 1

原创 Linux系统编程-线程(Thread)相关内容详解

在Linux系统中,线程(Threads)是指进程内部的轻量级执行单元。轻量级的进程(LWP:light weight process),在Linux环境下线程的本质仍是进程。进程:拥有独立的地址空间,拥有PCB,相当于独居。线程:有PCB,但没有独立的地址空间,多个线程共享进程空间,相当于合租。

2024-07-13 15:17:44 637

原创 Linux系统编程-信号(signal)详解

信号(signal)是一种用于进程间通信的机制,用来通知进程某些事件的发生。信号可以由操作系统、其他进程或者进程自身产生。信号提供了一种异步事件处理方式,使进程可以在事件发生时执行预定义的处理函数(信号处理程序),或采取默认动作。进程A给进程B发送信号,进程B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕后再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。每个进程收到的所有信号,都是由内核负责发送的。进程可以对

2024-07-12 21:44:53 748

原创 Linux系统编程-进程间通信(IPC)常用方式详解

进程间通信(IPC,Inter-Process Communication)是指在操作系统中,不同进程之间进行数据交换和信息传递的机制。这种通信允许正在运行的多个进程能够相互协作、共享数据或者进行同步操作,以实现更复杂的任务和功能。Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。

2024-07-12 16:39:24 2249

原创 Linux系统编程-进程控制相关操作详解

exit()标准 C 函数,执行标准的清理操作(如调用atexit()注册的函数)。刷新缓冲区,关闭文件描述符等。程序员通常使用它来正常终止进程。_exit()系统调用,直接返回内核,不执行任何标准的清理操作。程序员通常用于需要立即退出且不需要执行清理操作的情况。进程内存结构操作系统为每个进程分配一块内存空间,用于存储程序的代码、数据和堆栈等信息。这块内存空间包括了程序代码段、数据段、堆、栈等区域。进程执行过程当调用exec()

2024-07-11 20:34:27 1489

原创 Linux系统编程-内存映射相关操作详解

内存映射I/O(Memory-mapped I/O)是一种通过将文件的一部分或整个文件映射到进程的虚拟地址空间中来进行文件访问的技术。它允许程序直接在内存中操作文件数据,而不需要通过传统的read和write系统调用来进行IO操作,这种方法通常比传统IO更高效,尤其在处理大文件时效率更高。这样一来,进程就可以通过简单的内存访问操作(读取或写入内存)来访问文件的内容,而不需要频繁地调用read和write进行IO操作。

2024-07-10 17:25:34 678

原创 Linux系统编程-文件相关操作使用详解

(File Descriptor)是操作系统中用于访问和操作文件或输入输出资源的一个抽象指针。它是一个非负整数,标识一个已经打开的文件或输入输出资源(如管道、网络连接等)。在UNIX和类UNIX系统(如Linux)中,文件描述符是非常重要的概念,用于文件操作、进程间通信、网络编程等多个方面。

2024-07-09 22:18:10 797

原创 虚拟机未正常关机或断电后出现问题如何解决【图文教程】

GRUB是一个常见的引导加载程序,用于启动多个操作系统。出现这个界面是正常的,尤其是在你刚刚安装或者重启Ubuntu系统的时候。如果你想启动Ubuntu,只需要在这个界面上按回车键即可。如果你不需要使用其他高级选项或者内存测试选项,只需选择第一个选项即可。出现问题的前因是,昨天关闭电脑虚拟机和其他程序后,然后关机的时候电脑自己又重启了(经常出现这种情况),重启之后我就没管了。这是一个常见的情况,通常发生在系统未正常关机或断电后。鼠标右键找到你的虚拟机,点击电源,然后重新启动。然后查了一下原因,具体如下。

2024-07-09 20:22:07 475

原创 Linux系统编程-目录相关操作

在 Linux 系统编程中,opendir()readdir()和closedir()是用于目录操作的三个关键函数。它们通常与结构体一起使用,用于遍历目录中的文件和子目录。

2024-07-08 22:20:18 893

原创 Makefile的使用方法详解

Makefile 是一个文本文件,用于描述源代码之间的依赖关系和编译规则,以及如何编译和链接程序。它通常与 命令结合使用, 命令会根据 Makefile 中定义的规则来自动化地构建(编译和链接)项目中的各个文件。 makefile文件中定义了一系列的规则来指定, 哪些文件需要先编译, 哪些文件需要后编译, 哪些文件需要重新编译, 甚至于进行更复杂的功能操作, 因为makefile就像一个Shell脚本一样, 其中也可以执行操作系统的命令. makefile带来的好处就是——“自动化编译”,

2024-07-08 21:35:05 591

原创 GDB调试工具的使用方法详解【图文教程】

GDB(GNU Debugger)是一个功能强大的命令行调试工具,用于调试 C、C++ 等程序。它能够帮助开发者定位和修复程序中的 bug,查看程序状态、变量值以及函数调用堆栈。下面详细介绍 GDB 的使用方法和过程,并附上相应的代码示例。

2024-07-05 21:32:48 297

原创 gcc编译器的使用方法详解【图文教程】

GCC(GNU Compiler Collection)是一个开源的编译器套件,支持多种编程语言,包括 C、C++、Objective-C、Fortran、Ada 等。它是 Linux 和许多 Unix-like 系统中的默认编译器,也可以在 Windows 等平台上使用。

2024-07-05 20:42:01 459

原创 C语言小项目-词法分析器

词法分析器是编译器中的第一个阶段,其主要任务是扫描输入的源代码字符流,并将字符组成的序列转换为有意义的标记(Token)。每个 Token 包含一个词法单元的信息,如关键字、标识符、运算符、常量等。例如,对于表达式int a = 10;,词法分析器会生成诸如INTASSIGNNUMBER(10)和SEMICOLON等 Token。一个完整的编译器,大致会经历如下几个阶段:各个阶段的职责,简单描述如下:1.词法分析:对源文件进行扫描,将源文件的字符划分为一个一个的记号 (token) (

2024-07-02 22:22:32 1261

原创 FinalShell远程连接不上Ubuntu虚拟机的原因和解决办法【图文教程】

一般来说ssh服务安装成功和打开之后都能连接成功,需要注意两点。1.将虚拟机,虚拟网络编辑器中外部连接设置为NAT模式。2.在本机的网络设置中,更改适配器选项,检查对应的虚拟网卡是否关闭,如果关闭需要打开!!!(之前所有步骤都没问题,就是忘了需要打开这个)

2024-07-02 20:27:16 445

原创 C语言-堆(heap)排序算法的详解与实现

堆排序(Heap Sort)是一种高效的排序算法,基于堆这种数据结构实现。它具有稳定的O(nlogn)时间复杂度,适用于大规模数据的排序,尤其在实时数据处理和优先队列中应用广泛。本博客将深入介绍堆排序的原理、步骤以及使用C语言实现的示例。

2024-06-28 20:17:22 365

原创 C语言-堆(heap)的详解与实现

堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列。最大堆:父节点的值大于或等于任何一个子节点的值。最小堆:父节点的值小于或等于任何一个子节点的值。在堆中,树的每个节点的值都必须满足堆的性质。

2024-06-28 14:25:28 222

原创 C语言-希尔排序算法的详解与实现

希尔排序(Shell Sort)是一种改进的插入排序算法,它通过比较距离较远的元素来提升插入排序的性能。希尔排序将整个数组按一定间隔分割成若干个子数组,并对每个子数组进行插入排序;随着排序的进行,逐渐缩小间隔,直到间隔为1,最终完成排序。希尔排序由Donald Shell于1959年提出,是最早的突破O(n^2)时间复杂度的排序算法之一。

2024-06-28 09:20:41 244

原创 C语言-归并排序算法的详解与实现

归并排序(Merge Sort)是一种高效、稳定的排序算法,基于分治法(Divide and Conquer)的思想。它将待排序数组分成若干个子序列,分别排序后再合并,通过递归实现整个数组的排序。归并排序的主要优点在于其稳定的时间复杂度和能够处理大数据集的能力。

2024-06-28 09:13:49 300

原创 C语言-快速排序算法的详解与实现

快速排序(Quick Sort)是一种高效的排序算法,它采用分治策略(Divide and Conquer)来将一个数组分成两个子数组:小于基准值的元素和大于基准值的元素,然后递归地对子数组进行排序。快速排序的核心在于其分区(Partition)过程,该过程选取一个基准值,并将数组重新排列使得基准值左边的元素都小于等于基准值,右边的元素都大于基准值。

2024-06-28 09:12:08 150

原创 C语言-插入排序算法的详解与实现

插入排序(Insertion Sort)是一种简单直观的排序算法,其核心思想是将未排序的元素逐个插入已排序部分的合适位置,直到整个数组排序完成。它适用于小型数据集或是部分有序的数据集,并且相对于其他复杂度更高的算法,插入排序有较好的性能表现。

2024-06-28 09:10:02 231

原创 C语言-选择排序算法的详解和实现

选择排序(Selection Sort)是一种简单直观的排序算法,其基本思想是每次从未排序的部分中找到最小(或最大)的元素,然后将其放到已排序部分的末尾。它属于选择排序的一种,适用于小型数据集或是简单实现排序功能的场景。

2024-06-27 17:46:15 403

原创 C语言-冒泡排序算法的详解和实现

冒泡排序(Bubble Sort)是一种简单直观的排序算法,它重复地遍历要排序的列表,比较相邻的两个元素,并依据大小交换它们的位置。它属于交换排序的一种,因其操作过程中元素如同"冒泡"一般逐步移动到正确位置而得名。

2024-06-27 17:30:22 748

空空如也

空空如也

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

TA关注的人

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