自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基于UDP的套接字通信(附通信代码)

测试:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传。

2024-01-29 13:44:25 956

原创 IO多路复用-epoll

epoll 全称 eventpoll,是 linux 内核实现IO多路转接/复用(IO multiplexing)的一个实现。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。select和poll每次都会线性扫描整个待检测集合,集合越大速度越慢,epoll使用的是回调机制,效率高,处理效率也不会随着检测集合的变大而下降。

2024-01-26 17:52:11 928 1

原创 IO多路复用-poll(附通信代码)

nfds: 这是第一个参数数组中最后一个有效元素的下标 + 1(也可以指定参数1数组的元素总个数)fds: 这是一个struct pollfd类型的数组, 里边存储了待检测的文件描述符的信息。0:不阻塞,不管检测集合中有没有已就绪的文件描述符,函数马上返回。大于0:阻塞指定的毫秒(ms)数之后,解除阻塞。timeout: 指定poll函数的阻塞时长。

2024-01-25 12:13:35 417

原创 c++ bitset使用方法

是C++中用于处理二进制位的标准库类,它允许你以一种直观的方式操作二进制位。

2024-01-25 09:20:21 453

原创 多线程select并发

还有就是在检测到有通信描述符在rdsert集合中被返回时, 在创建一个子线程, 完成通信操作。主线程在检测到有新的客户端连接之后, 创建一个子线程完成。是一个自定义的结构体。

2024-01-24 19:03:12 342

原创 IO多路复用-select(附通信代码)

I/O多路复用(I/O Multiplexing)是一种通过一种机制同时监听多个文件描述符(sockets、文件、设备等)的技术。它可以使一个进程在等待多个 I/O 操作完成时不会阻塞,从而提高程序的性能和响应性。通过这种方式在单线程/进程的场景下也可以在服务器端实现并发。。I/O多路复用的优势在于它可以有效地管理大量的连接,避免了创建大量线程或进程的开销。它适用于需要同时处理多个连接,但每个连接的数据流量相对较小的情况,如网络服务器、聊天程序等。

2024-01-24 17:27:34 823

原创 基于线程池的TCP套接字通信

其中添加监听和通信任务函数的时候的参数问题需要创建两个结构体, 具体细节在代码中已经体现出来了。客户端的代码和线程池代码在之前的文章里已经有了, 都不变。

2024-01-22 18:41:23 459

原创 基于多线程的套接字通信

在多线程版的服务器端程序中,多个线程共用同一个地址空间,有些数据是共享的,有些数据的独占的。解决这种问题有多种方法, 我们先来看多线程解决。就是三个服务器和客户端在通信。

2024-01-22 11:34:02 421 1

原创 TCP重传, 滑动窗口, 流量控制, 拥塞控制

实际上「报文往返 RTT 的值」是经常变化的,因为我们的网络也是时常变化的。当接收端的缓冲区面临数据溢出时,窗口大小的值也是随之改变,设置为一个更小的值通知发送端,从而控制数据的发送量,这样达到流量的控制。所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以。

2024-01-21 14:33:36 1058

原创 TCP的三次握手和四次挥手

序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。确认应答号:指**下一次「期望」收到的数据的序列号**,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。ACK:该位为1时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的SYN包之外该位必须设置为1。RST:该位为1时,表示 TCP 连接中出现异常必须强制断开连接。SYN。

2024-01-21 13:10:46 1040

原创 套接字通信(附带单线程TCP套接字通信代码)

当检测到有新的客户端连接请求时,阻塞解除,新连接就建立了,得到的返回值也是一个文件描述符,基于这个文件描述符就可以和客户端通信了。如果连接没有断开,接收端接收不到数据,接收数据的函数会阻塞等待数据到达,数据到达后函数解除阻塞,开始接收数据,当发送端断开连接,接收端无法接收到任何数据,但是这时候就不会阻塞了,函数直接返回0。总的来说,局域网和广域网在范围、连接设备、传输速度以及应用场景上有明显的区别,它们在网络体系中协同工作,为不同规模和需求的组织提供了灵活的网络解决方案。

2024-01-20 21:55:37 901

原创 mian函数中exit(0)是什么意思

在实际应用中,程序员可以根据需要选择适当的返回值。这些返回值可以在调用程序中进行解释,以了解程序的执行状态。例如,在Unix/Linux系统中,可以通过在终端中运行。是用于正常退出程序的方式。这行代码的含义是让程序在此处结束执行,并返回操作系统。通常表示程序成功执行,而非零值通常用于表示程序在执行过程中发生了错误。是一种正常退出程序的方式,通常用于表示程序成功执行。命令查看最近运行的程序的退出状态。

2024-01-20 21:43:41 581

原创 线程池c++实现

线程池(Thread Pool)是一种并发编程的设计模式,它用于管理和重复使用线程,以提高程序的性能和资源利用率。线程池通过维护一组预先创建的线程,这些线程可以在需要时被重复使用,而不是为每个任务都创建一个新的线程。线程池通常包含以下主要组件用于存储待执行的任务。当有新的任务到达时,它被放入任务队列中等待执行。一组预先创建的线程,它们在整个程序的生命周期内一直存在。这些线程从任务队列中获取任务,并执行任务的操作。负责管理线程池的创建、销毁和任务分配等工作。

2024-01-20 16:19:50 841

原创 什么是RAII?

当FileHandler对象的生命周期结束(如函数返回时),其析构函数会被调用,文件会被自动关闭。这种方法不仅代码清晰,而且能有效避免资源泄漏,特别是在遇到异常情况时。在C++中,RAII通常通过类的构造函数进行资源获取,通过析构函数进行资源释放来实现。当对象创建时,其构造函数会获取必要的资源,当对象超出作用域时,其析构函数会被自动调用,释放资源。它是一种编程习惯,通常用于C++等语言,用于管理资源,如内存、文件句柄、网络连接等。资源在对象初始化时获取,在对象销毁时自动释放。

2024-01-12 10:05:16 353

原创 实现线程同步的几种方式

条件变量(Condition Variable)是一种多线程同步的机制,用于在多个线程之间建立通信。条件变量通常与互斥锁(Mutex)一起使用,以解决线程间的协调和同步问题。**条件变量用于在某个条件发生或者满足时通知其他线程。**典型的情况是,一个线程等待某个条件变为真,而另一个线程在某些情况下负责将条件设置为真,并通知等待的线程。这样,等待线程可以被唤醒并继续执行。

2024-01-11 16:31:48 1094

原创 什么是线程?

线程是计算机科学中的基本概念,指的是在一个进程中执行的独立指令流。通常,一个进程可以包含多个线程,它们共享进程的资源,如内存空间、文件句柄等,但每个线程有自己的独立执行流。线程是操作系统进行调度的最小单元进程是资源分配的最小单位),它由线程标识符、程序计数器、寄存器集合和堆栈组成。与进程不同,**线程之间可以更轻松地共享数据和通信,因为它们属于同一个进程,共享相同的地址空间。**这使得线程在并发编程中更为灵活,可以用于实现多任务并行执行。多线程的优点包括提高程序的响应性、资源共享和更高的系统利用率。

2024-01-10 20:15:40 398

原创 第十章 构建Web内容的技术

第十章 构建Web内容的技术10.1 HTML10.1.1 Web页面几乎全由HTML构建HTML(HyperTextMarkup Language,超文本标记语言)是为了发送Web上的超文本(Hypertext)而开发的标记语言。超文本是一种文档系统,可将文档中任意位置的信息与其他信息(文本或图片等)建立关联,即超链接文本。标记语言是指通过在文档的某部分穿插特别的字符串标签,用来修饰文档的语言。我们把出现在HTML文档内的这种特殊字符串叫做HTML标签(Tag)。平时我们浏览的Web页面几乎全是使

2024-01-10 15:54:01 927

原创 什么是守护进程?

函数使自己成为新 session 的领头进程(会长),并且这个 session 领头进程还会被放入到一个新的进程组中。这个组中必须有一个组长, 组长就是进程组中的第一个进程,组长以外的都是普通的成员,每个进程组都有一个唯一的组ID,进程组的ID和组长的PID是一样的。注意,实际上守护进程的核心工作部分是一个简单的无限循环,我们可以根据实际需求来添加守护进程的具体逻辑。一个普通的进程可以调用。获取指定的进程所在的进程组的组ID,参数 pid 就是指定的进程。将某个进程移动到其他进程组中或者创建新的进程组。

2024-01-10 11:05:47 446

原创 信号-进程间通信

在 Linux 操作系统中,信号是一种进程间通信的机制,用于通知进程发生了某个事件。信号可以由内核、其他进程,或者进程自身发送。每个信号都对应一个特定的事件或异常,例如进程终止、Ctrl+C 中断等。本质上是一个整数,不同的信号对应不同的值,由于信号的结构简单所以天生不能携带很大的信息量,但是信号在系统中的优先级是非常高的。非常不建议使用信号进行进程间通信。信号集(Signal Set)是用于表示一组信号的数据结构。

2024-01-10 10:10:44 859

原创 第九章 基于HTTP的功能追加协议

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许在客户端和服务器之间进行实时的、双向的数据传输。与传统的 HTTP 协议不同,WebSocket 在建立连接后,可以在客户端和服务器之间进行持久性的通信,而不需要频繁地建立和断开连接。WebSocket 连接的建立是通过 HTTP/HTTPS 协议进行的握手过程。客户端发送一个 HTTP 请求,服务器在响应中确认升级为 WebSocket 连接。之后,客户端和服务器之间的通信将基于 WebSocket 协议进行。

2024-01-09 16:34:00 1172

原创 进程间的通信方式-共享内存和内存映射区的区别

shm:进程退出对共享内存没有影响,调用相关函数/命令/ 关机才能删除共享内存。数据的完整性 -> 突发状态下数据能不能被保存下来(比如: 突然断电)shm: 直接对内存操作,效率高。实现进程间通信的方式。

2024-01-09 15:12:36 357

原创 共享内存-进程间通信

共享内存是一种进程间通信的机制,它允许多个进程在它们的地址空间中映射相同的一块物理内存,从而实现进程之间的数据共享。通过共享内存,不同进程可以直接读取和写入这块内存,而无需经过内核空间,因此通常比其他进程间通信机制更为高效。在所有进程间通信的方式中共享内存的效率是最高的。共享内存允许多个进程直接访问相同的内存区域,无需通过中间缓冲区或消息传递的方式,提高了数据传输的效率。由于不涉及内核空间的数据传输,共享内存通常比其他进程间通信方式(如管道或消息队列)更为高效。

2024-01-09 15:10:28 894

原创 内存映射-进程通信

管道的读写是阻塞的,内存映射区的读写是非阻塞的。内存映射区创建成功之后,得到了映射区内存的起始地址,使用相关的内存操作函数读写数据就可以。通信的进程需要将各自的内存映射区和同一个磁盘文件进行映射,这样进程之间就可以通过磁盘文件这个唯一的桥梁完成数据的交互了。length: 创建的内存映射区的大小(单位:字节),实际上这个大小是按照4k的整数倍去分配的。由于每个进程的地址空间是独立的,各个进程之间也不能直接访问对方的内存映射区,需要**prot: 对内存映射区的操作权限。实现进程间通信,还可以通过函数。

2024-01-08 19:42:58 331

原创 第八章 确认访问用户身份的认证

在计算机安全和网络通信的背景下,认证是**确认实体(如用户、计算机系统、服务)身份真实性的过程。**认证是确保系统只对合法用户或实体开放访问权限的一种关键机制。在网络通信中,认证通常涉及验证用户或设备是否具有访问特定资源或服务的权限。认证过程通常包括以下步骤:认证的目的是确保只有合法用户或设备才能够访问系统的敏感信息或服务。它是网络安全的基础,用于防止未经授权的访问和防范身份伪装。HTTP/1.1使用的认证方式BASIC认证(Basic Authentication)是一种简单的HTTP认证协议,它是HTT

2024-01-08 16:44:32 904

原创 进程间通信方式-管道

管道(Pipe)是一种在 Unix/Linux 等操作系统中**用于进程间通信的机制**。它可以用于在两个相关的进程之间传递数据,实现简单的数据流通信。管道分为匿名管道和命名管道(FIFO)两种。管道的本质其实就是内核中的一块内存(或者叫内核缓冲区),这块缓冲区中的数据存储在一个环形队列中,因为管道在内核里边,因此我们不能直接对其进行任何操作。管道对应的内核缓冲区大小是固定的,默认为4k(也就是队列最大能存储4k数据)管道分为两部分:读端和写端(队列的两端),数据从写端进入管道,从读端流出管道。

2024-01-08 15:59:40 744

原创 进程控制-操作系统

进程和程序的区别:程序和进程是两个不同的概念,他们的状态,占用的系统资源都是不同的。程序:就是磁盘上的可执行文件文件, 并且只占用磁盘上的空间,是一个静态的概念。被执行之后的程序叫做进程不占用磁盘空间,需要消耗系统的内存,CPU资源,每个运行的进程的都对应一个属于自己的虚拟地址空间,这是一个动态的概念。

2024-01-05 20:44:44 921

原创 第七章 确保Web安全的HTTPS

HTTP 协议中没有加密机制,但可以通过和SSL( Secure Socket Layer,安全套接层)或TLS(Transport LayerSecurity,安全层传输协议)的组合使用,加密HTTP的通信内容用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信了。在使用数字证书的场景中,最常见的是SSL/TLS通信中的服务器证书。但就目前的技术来看是不太现实的。使用公开密钥加密方式,**发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。

2024-01-04 20:21:49 931

原创 文件描述符复制和重定向

(file control)是一个用于对文件描述符进行各种控制操作的系统调用。它提供了一系列功能,包括文件状态标志的设置和获取、文件锁定、以及对文件描述符的其他控制操作。,然后可以通过这两个文件描述符来独立地对同一文件进行操作。返回的新文件描述符是系统中当前可用的最小文件描述符。主要介绍另几个可以用来分配文件描述符的函数。函数是用于复制文件描述符的系统调用,与。以下是一个简单的示例,演示如何使用。以下是一个简单的示例,演示如何使用。,生成了一个新的文件描述符。在上述示例中,dup2。

2024-01-04 15:46:13 903

原创 第六章HTTP首部

这些非正式的首部字段统一归纳在RFC4229HTTPHeader FieldRegistrations中。

2024-01-03 19:45:56 1249

原创 文件属性信息

在stat命令中,-c参数用于自定义输出格式。通过-c参数,你可以指定输出的信息,并使用一些格式控制符来代表文件的各种属性。下面是一些常用的-c%a:文件权限,八进制表示。%A:文件权限,人类可读表示。%n:文件名。%s:文件大小(以字节为单位)。%b:文件的块数。%B:每块的字节数。%d:设备编号。%i:文件的 inode 号。%U:文件所有者的用户名。%G:文件所属组的组名。%x:文件的最后访问时间。%y:文件的最后修改时间。%z:文件的最后变化时间。下面是一个使用-c参数的。

2024-01-03 17:20:20 899

原创 Bash和Shell有什么区别?

但其他的 Shell,比如 sh、csh、zsh,也是可用的。,但不是所有的 Shell 都是 Bash。

2024-01-03 16:36:18 522

原创 Linux系统文件IO

当我们需要下载很大的文件时, 磁盘紧张, 如果不能马上将文件下载到本地, 磁盘可能会被占用, 这时可以现将字符写入到目标文件中, 让扩展的文件和被下载的文件一样大即可。在前面介绍了文件描述符,在Linux系统中必须要使用系统提供的IO函数才能基于这些文件描述符完成对相关文件的读写操作。函数用于打开一个文件,并返回一个文件描述符,该文件描述符在后续的文件操作中被用作文件的标识符。不管是使用这两个函数还是使用 lseek() 函数拓展文件,文件尾部填充的字符都是 0。函数用于从已打开的文件描述符中读取数据。

2024-01-03 10:41:11 843

原创 文件描述符

*文件描述符是进程级的,每个进程都有它自己的文件描述符表。通过open()函数打开 /hello.txt,文件描述符 3 被分配给了这个文件,保持这个打开状态,再次通过open()函数打开 /hello.txt,文件描述符 4 被分配给了这个文件,也就是说一个进程中不同的文件描述符打开的磁盘文件可能是同一个。文件描述符(file descriptor,简称fd),当在进程中打开一个现有文件或者创建一个新文件时,内核向该进程返回一个文件描述符,用于对应这个打开/新建的文件。一些基本的系统调用,比如。

2023-12-31 15:03:47 401

原创 虚拟地址空间

虚拟地址空间是指操作系统为每个运行中的进程分配的抽象地址空间。这个地址空间使得每个进程都觉得它拥有一个独立的、连续的内存区域,而实际上这个内存区域可能分布在物理内存的不同位置,甚至可能被存储在磁盘上。在虚拟地址空间中,进程访问的是虚拟地址,而不是实际的物理地址。操作系统(MMU, 内存管理单元, Memory Management Unit)负责将虚拟地址映射到物理地址,这个过程称为地址转换。通过虚拟地址空间,操作系统可以为每个进程提供独立的、隔离的内存空间,从而增加了系统的稳定性和安全性。

2023-12-31 15:02:01 1086

原创 GDB调试

*GDB(GNU Debugger)**是一款用于调试程序的开源调试工具,它是 GNU 工具集的一部分。GDB 可以用于调试多种编程语言,包括 C、C++、Fortran 和其他一些语言。

2023-12-29 15:15:57 794

原创 nth_element

将第 n(由迭代器指定)小的元素移动到正确的位置,并保证该元素左侧的所有元素都不大于它,右侧的所有元素都不小于它。是 C++ 标准库中的一个算法,用于对指定范围的元素进行部分排序。这个算法在给定范围内的元素中,它的效率在处理大型数据集时比完全排序要高,因为它只关心排在中间位置的元素。这个函数还可以自己指定谓词, 即排序规则, 用来找第n大的元素(逆向思维也可以)这个函数的时间复杂度为 O(N),其中 N 是。处的元素是整个范围中的第。中的元素重新排列,使得。处的元素为整个范围中第。

2023-12-29 09:08:58 504

原创 第五章 与HTTP协作的Web服务器

实现这一功能的关键是在服务器的配置中定义多个虚拟主机,并为每个虚拟主机指定相应的域名和相关的配置信息,以确保服务器能够正确地区分和响应来自不同域名的请求。换句话说,当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。当遇上源服务器上的资源更新时,如果还是使用不变的缓存,那就会演变成返回更新前的“旧”资源了。在传统的基于IP地址的服务器配置中,一台服务器通常只能提供一个域名的服务。

2023-12-27 10:34:28 1466

原创 Qt中鼠标点击的几种状态

对于可切换的按钮,选中状态可以通过用户的点击操作或者通过编程方式进行切换。这些事件与按钮的状态有关。信号既可以由用户的交互触发,也可以通过编程方式触发。在Qt中,鼠标点击按钮通常会触发一系列的事件,包括。事件:当用户按下鼠标左键时触发。事件:当用户释放鼠标左键时触发。事件:在按钮被按下并释放时触发。,主要用于可切换的按钮,例如复选框(以下是一个简单的示例,演示了如何使用。函数:模拟按钮点击。

2023-12-25 19:27:09 1199

原创 第四章-状态码

具体而言,当客户端请求一个资源,并且该资源在服务器上自客户端上次请求之后没有发生变化时,服务器可以返回 304 状态码,告知客户端可以继续使用它在缓存中保存的版本,而不用重新传输整个资源。比如,使用GET 方法时,对应请求资源的实体会作为响应返回:而使用HEAD方法时,对应请求资源的实体首部不随报文主体作为响应返回(即在响应中只返回首部,不会返回实体的主体部分)。另外,也不允许返回任何实体的主体。这里的关键是客户端收到 307 响应后,会继续使用原始请求的方法和请求体,将请求发送到新的 URI。

2023-12-25 17:13:30 954

原创 makefile进阶版

用户可以定义自己的变量,称为用户自定义变量。makefile 中的变量是没有类型的直接创建变量然后给其赋值就可以了。# 错误, 只创建了变量名, 没有赋值变量名# 正确, 创建一个变量名并且给其赋值变量名=变量值取出变量的值# 如果将变量的值取出?$(变量的名字)# 举例 add.o div.o main.o mult.o sub.o# 定义变量并赋值# 取变量的值$(obj)自定义变量使用举例# 这是一个规则,普通写法# 这是一个规则,里边使用了自定义变量。

2023-12-25 10:19:31 852

空空如也

空空如也

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

TA关注的人

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