![](https://img-blog.csdnimg.cn/ae8c673f7d524bd896234f4d2133aec7.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
基于多反应堆的高并发服务器【C/C++/Reactor】
文章平均质量分 94
整理课堂笔记和心得,爱编程的大丙:基于多反应堆的高并发服务器【C/C++/Reactor】
呵呵哒( ̄▽ ̄)"
喜欢分享学习笔记,并不一定是正确的,阶段性的学习成果做一下记录,欢迎一起交流讨论,也希望有错误的地方可以向我提出,我会虚心接受并纠正
展开
-
基于多反应堆的高并发服务器【C/C++/Reactor】(中)HtttpRequest的定义和初始化、资源重置和销毁 以及 添加和查找HttpRequest请求头
一、Get方式提交数据如果使用get的方式向服务器提交数据,数据并没有在请求协议的第四部分,而是在请求行的第二部分。如果使用get方式提交数据,第四部分是空的这是浏览器对用户的请求数据进行了封装之后,得到的原始的http请求数据>>http get请求报文的格式请求行\r\n请求头\r\n空行(\r\n)提示: 每项信息之间都需要一个\r\n,是由http协议规定>>http post请求报文的格式请求行\r\n请求头\r\n空行(\r\n)请求体。原创 2024-01-08 16:39:21 · 616 阅读 · 3 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)创建一个TcpConnection实例 以及 接收客户端数据
被释放的这个文件描述符被复用了,所以我们就会发现当前的这个文件描述符对应的连接的名字和之前的某个文件描述符对应的连接的名字是相同的。个线程,那么把第一个任务给第一个子线程,再把第二个任务给第二个子线程,再把第三个任务给第三个子线程,再把第四个任务给第四个子线程。通过这三个函数,传出的数据,我们就能够知道用于监听的文件描述符lfd它对应的读事件触发了。模块需要在子线程里边运行的,故需要通过子线程去访问线程池,从线程池找出一个子线程,每个子线程都有一个。是属于子线程的,是从子线程传过来的一个反应堆模型的地址。原创 2024-01-05 19:21:30 · 1875 阅读 · 2 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)创建并初始化TcpServer实例 以及 启动
在当前服务器启动之后,需要处理的文件描述符有且只有一个,就是用于监听的文件描述符,因此需要把待检测的文件描述符(用于监听的)添加到(),不停地去检测有没有客户端的连接到达,有没有客户端给服务器发送数据,描述的这些动作,反应堆模型能够胜任。事件循环的启动与任务添加:服务器启动后,需要将监听的文件描述符添加到事件循环(,剩下的事就是把服务器模型里边的代码实现一下,基于服务器的整体流程实现一下。,在通信的时候,需要把接收的数据和要发送的数据存储到一块内存里边,启动线程池,之后,需要让它处理任务,对于当前的。原创 2024-01-05 14:15:20 · 808 阅读 · 3 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)Buffer的创建和销毁、扩容、写入数据
函数时,需要考虑如何处理内存的写入和接收数据的情况。在写数据之前,可能需要进行内存扩容以确保有足够的空间。写数据时,需要从上次写入的。在实现内存扩容函数时,需要考虑如何处理内存的写入和接收数据的情况。写数据之前可能需进行内存扩容,并从上次写入的。完成写入后,需要再次更新。内核中减少了多次系统调用的开销。位置开始,完成写入后再次更新。(2)然后把这块内存的数据。一次接收多个缓冲区中的数据。这块内存的大小,将值赋给。移动内存实现合并内存。到前面去,这就实现了。原创 2024-01-04 19:28:46 · 712 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)线程池的启动和从线程池中取出一个反应堆实例
线程池被创建后,需要启动使其子线程运行。启动线程池的函数需要一个有效。如果线程数量为零,线程池可以提供一个事件循环的反应堆模型(如果条件满足,将线程池标记为已启动,并初始化并启动子线程。函数可以从线程池中取出某个子线程的反应堆实例。作为参数,和threadNum代表。确保线程池未运行且执行线程为主线程。如果线程数量大于零,通过。取余数,并将结果赋值给。函数进行初始化,通过。如果线程数量大于零,原创 2024-01-03 23:36:31 · 662 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)子线程 WorkerThread的实现 和 线程池ThreadPool的初始化
(反应堆模型),就需要把这个通信的文件描述符交给这个反应堆模型去管理,检测这个文件描述符的事件,如果有读事件,说明客户端有数据发送过来,那么我们就需要接收数据,然后再给客户端回复数据,这些都是在子线程的反应堆模型里边做的。此时这个线程池里边就没有子线程了,也就没有反应堆模型了,也就没有办法工作,在这种情况下,我们就可以让线程池使用主线程的反应堆模型,这样就能够保证线程池还能够继续工作,只不过在当前服务器框架里边,它的反应堆模型就从多个变成了一个,所有的任务都变成了全部由主线程的反应堆模型来处理了。原创 2024-01-03 18:28:34 · 674 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)添加 删除 修改 释放
结构体,以适应更多的文件描述符和事件处理需求。考虑如何在代码中实现更清晰的事件处理逻辑,以提高代码的可读性和可维护性。函数,就可以得到激活的文件描述符,得到了激活的文件描述符之后,需要通过这个文件描述符找到它所对应的。将任务队列中的任务添加到Dispatcher的文件描述符检测集合中。,指向的底层函数可能是不一样的,这个取决于我们选择的。)中我们讲解了处理任务队列中的任务的具体流程,这个函数指针指向的函数的处理动作也就不一样。对应的文件描述符检测集合中,函数指针。处理文件描述符,以及如何通过。原创 2024-01-02 23:12:34 · 841 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)处理任务队列中的任务
小细节:假设说添加任务的是主线程,那么程序就会执行taskWakeup这个函数,主线程执行这个函数,对于子线程来说有两种情况,第一种情况它正在干活,对于子线程没有影响,充其量就是它检测的那个集合里边多出来了一个被激活的文件描述符。这个函数去处理任务队列里边的任务。子线程肯定是在运行的,而子线程是在dispatch函数的位置解除了阻塞,然后调用。肯定是子线程自己修改自己检测的文件描述符的事件,修改完了之后,子线程就直接调用。第二个路径:主线程在子线程的任务队列里边添加了一个任务,主线程是处理不了的,原创 2024-01-02 22:38:51 · 1079 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop的任务队列中添加新任务
其中,任务队列是一个链表,每个节点包含channel类型、文件描述符和操作类型。是主线程,那么我们能够让主线程。(1) 为什么在上面。原创 2024-01-02 18:28:48 · 677 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)主线程给子线程添加任务以及如何处理该任务
基于多反应堆的高并发服务器【C/C++/Reactor】(中)EventLoop初始化和启动_一个eventloop 可以有多少个连接-CSDN博客。基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop的任务队列中添加新任务-CSDN博客。参数指向一个整数数组,用于存储创建的。函数用于初始化一个事件循环(,用于接收来自子进程的数据。函数用于创建一个双向的。参数指定套接字家族(如。参数指定套接字类型(如。参数指定套接字协议(如。)对象,并为其分配一个。原创 2024-01-02 19:16:42 · 1075 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop中处理被激活的文件描述符的事件
6. 在epoll函数中,通过epoll_wait进行检测,遍历返回的events数组,调用event_activity函数处理事件。1. 反应堆模型:一种处理系统事件或网络事件的模型,当文件描述符被激活时,可以检测到。3. 处理激活的文件描述符的函数:当文件描述符被激活时,需要有一个函数来处理这些事件。2. 文件描述符:在操作系统中,用于标识打开的文件、套接字等的一种数据类型。结构体:存储与文件描述符相关的事件处理动作的结构体。函数返回的是一个事件列表,而不是具体的文件描述符。原创 2024-01-02 15:53:57 · 1629 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)EventLoop初始化和启动
当这个任务队列里边有了任务之后,我们就需要通过一个循环,把链表里边所有的节点都读出来。关于子线程的这个名字肯定是我们给它起的,因为子线程创建出来之后,它只有一个ID,这是系统分配的。另外不管是哪一个底层的检测模型,它们都需要使用一个数据块,这个数据块就叫做。是一个事件分发模型,通过这个模型,就能够检测对应的文件描述描述符的事件的时候,可以使用。除此之外,还有另外一个部分,因为在这个反应堆模型里边对应一系列的文件描述符,都属于。,也就意味着这个队列里边的节点的个数是不固定的,所以我们就需要一个。原创 2023-12-26 17:11:12 · 1618 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)EpollDispatcher、PollDispatcher、SelectDispatcher的实现
基于多反应堆的高并发服务器【C/C++/Reactor】(中)EpollDispatcher的实现。原创 2023-12-25 16:27:36 · 535 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)Channel 模块的实现
的话,大部分肯定是用于通信的,除了这个文件描述符之外,我们还需要检测这个文件描述符对应的事件,肯定是基于IO多路模型的。在判断事件方面,对于通信的文件描述符,不能去掉写事件的检测,否则无法接收客户端数据。:事件循环,因为服务器启动起来之后,一直有事件不停地触发,这个事件包括客户端的新连接,以及已经建立连接的客户端和服务器之间的数据通信。,主要是封装了一个文件描述符,这个文件描述符。可能适用于监听的,也可能适用于通信的, 在服务器端用于监听的文件描述符有且只有一个,用于通信的文件描述符,就有若干个了。原创 2023-12-22 11:57:25 · 1685 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)Dispatcher模块的实现思路和定义
(四)Dispatcher模块的实现思路。原创 2023-12-23 16:15:14 · 870 阅读 · 2 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(中)ChannelMap 模块的实现
通过Dispatcher检测一系列的文件描述符所对应的事件,因此在Channel中我们除了封装这些文件描述符之外,还需要指定这些文件描述符需要检测的事件。封装后的通道对应一个专属的文件路径,用于接收客户端连接和通信。反应堆模型中的Channel是一个封装了文件描述符的通道,用于通信和监听,这个Chanel 对应一个文件描述符,可以是通信的,也可以是监听的。EventLoop:事件循环,因为服务器启动起来之后,一直有事件不停地触发,这个事件包括客户端的新连接,以及已经建立连接的客户端和服务器之间的数据通信。原创 2023-12-22 23:43:17 · 1274 阅读 · 0 评论 -
基于多反应堆的高并发服务器【C/C++/Reactor】(上)
通常,人们习惯用可读性好的字符串来表示 IP 地址,比如用点分十进制字符串表示 IPv4 地址,以及用 十六进制字符串表示 IPv6 地址。而记录日志时则相反,我们要把整数表示的 IP 地址转化为可读的字符串。这种方式可以确保程序在等待某个文件描述符上有事件发生时只占用较少的资源,而不是像。的工作原理是通过一个事件表来跟踪所有需要监控的文件描述符,当某个文件描述符上有事件发生时,信号,该信号是子进程退出的时候向父进程发送的。的主要优点是它只占用较少的资源,并且比传统的。,可以用于处理大量文件描述符的。原创 2023-12-21 23:35:41 · 2029 阅读 · 0 评论