
Muduo网络库大师之路
文章平均质量分 95
GalaxyPokemon
这个作者很懒,什么都没留下…
展开
-
Muduo网络库实现 [十六] - HttpServer模块
本模块就是设计一个HttpServer模块,提供便携的搭建http协议的服务器的方法。那么这个模块需要如何设计呢?这还需要从Http请求说起。首先从http请求的请求行开始分析,请求行里面有个方法。分为和的。顾名思义就是用来获取服务器中的某些路径下的实体资源,比如文件的内容等,这一类请求中,url 中的资源路径必须是服务器中的一个有效的存在的文件路径。而如果提取出来的资源路径并不是一个实体文件的路径,那么他大概率是一个。原创 2025-04-18 13:25:46 · 829 阅读 · 0 评论 -
Muduo网络库实现 [十五] - HttpContext模块
记录每一次请求处理的进度,便于下一次处理。上下文模块是模块中最重要的一个模块,他需要记录每一次请求处理的进度,需要保存一个HttpRequest对象,后续关于这个连接的http的处理的信息全部都是在这个上下文中保存。那既然是记录,肯定就要让它知道当前是在哪个进度了,所以我们就用状态码去表示通常,而不是已经完成的状态。原创 2025-04-04 22:05:16 · 1157 阅读 · 0 评论 -
Muduo网络库实现 [十四] - HttpResponse模块
比如说请求的报文里是登录的内容,那么我们肯定是要给它返回一个登录的界面的,所以这个就是为什么要设置响应正文了。这个模块和HttpRequest一样,主要就是存储http响应的要素,但是其实真正需要设置存储的要素会比http请求少,首先,要存储http的版本号,我们最终使用的是请求中的版本号。GetHeader函数获取指定头部字段的值,用于读取已设置的头部信息 在 _headers 中查找指定的 key。因为未来可能对方请求的资源已经转移了,那么我们需要返回一个重定向报文,将新的url返回给客户端,原创 2025-04-17 23:38:55 · 988 阅读 · 0 评论 -
Muduo网络库实现 [十三] - HttpRequest模块
首先我们要先知道HTTP的请求的流程是什么样子的,不然我们会学的很迷糊。对于HTTP请求如何到来以及去往哪里,我们应该很清楚的知道。它本质上是HTTP请求信息的容器,使服务器能够方便地访问和处理客户端的请求内容。再HttpRequest的头部字段中,有一个很重要的信息就是。最后就是正文部分,正文部分是交给上层业务逻辑去处理的,我们。比如对请求行的解析,我们会使用正则表达式来进行,同时,对于参数和请求头部,我们可以提供结构,用来。首先请求行中,有请求方法,url ,协议版本,,长短连接后续我们会用到。原创 2025-04-04 23:59:03 · 1387 阅读 · 6 评论 -
Muduo网络库实现 [九] - EventLoopThread模块
也就是我们的_thread_id还没有切换到我们想要的线程id上,还在创建EventLoop的线程中,那么这时候操作就是由这个创建EventLoop的线程执行了,而后续切换线程之后,又会由新的线程来执行操作,那么就会出现一个连接的所有操作并不在一个线程中全部完成,可能会出现在多个线程中执行的情况,同时,在设置我们的指针成员的同时,有可能由其他的线程需要获取这个指针,那么就会出现读写并发的情况,或者说这个指针变量会有线程安全问题。然后就是构造函数,无非就是初始化_loop和设置thread的入口函数。原创 2025-04-03 20:00:16 · 1128 阅读 · 19 评论 -
Muduo网络库实现 [十] - EventLoopThreadPool模块
在多Reactor模式中,通常有一个主Reactor(MainReactor)负责接受连接,然后有多个从属Reactor(SubReactor)负责处理已建立连接的I/O事件。EventLoopThreadPool就是管理这些SubReactor线程的线程池。原创 2025-04-03 18:17:33 · 1253 阅读 · 17 评论 -
Muduo网络库实现 [八] - Acceptor模块
Acceptor模块是专门用于接收获取新连接,该模块挂载在主Reactor线程上。也就是创建一个监听套接字。为监听套接字设置读回调函数。当监听套接字读事件到来时,需要自动调用读事件回调,为新连接创建Connection对象并添加管理,同时Acceptor还需要和一个EventLoop绑定。那么Acceptor中需要,我们需要提供TcpServre的接口来进行,TcpServer模块会对服务器的所有模块进行统一管理。原创 2025-04-02 16:48:13 · 937 阅读 · 0 评论 -
Muduo网络库实现 [七] - Connection模块
具体执行的操作就是这样的,但是 Upgrade 这个接口有点特殊,它是线程不安全的,所以必须在EventLoop线程中执行,同时,这还不够,他必须被立马执行,不能放到任务队列中,因为如果如果放到任务队列中,那么如果此时有读事件到来,那么就会先进行事件处理,也就是会先使用老的处理函数进行处理,然后才更新回调方法,这是不对的,我们必须在调用Upgrade的时候立即将协议的回调函数和上下文进行替换。然后就是任意事件回调,任意事件回调我们只需要判断是否启动了超时连接,如果启动了,那么就需要刷新定时任务。原创 2025-04-03 13:51:08 · 1398 阅读 · 17 评论 -
Muduo网络库实现 [五] - Poller模块
因为未来我们在添加某个事件的监控时,有可能该文件描述符在之前我们并没有添加到 epoll 模型中,这时候我们使用的是 EPOLL_CTL_ADD 操作,而其他的时候,对监控的事件进行修改,则是EPOLL_CTL_MOD操作,仅仅是对epoll模型中的红黑树节点中的内容进行修改,并不对节点的删除与插入做管理。是要传给Channel中的回调函数处理的。那么这个对象中要实现事件的监控,就必须要保存一个epoll操作句柄(就是钥匙,没有这个钥匙,启动不了对应的epoll),也就是一个_epfd。原创 2025-04-01 14:54:23 · 868 阅读 · 4 评论 -
Muduo网络库实现 [四] - Channel模块
具体来说每一个套接字都会对应一个 Channel 对象,用于对它的事件进行管理。可以对于描述符的监控事件在用户态更容易维护,以及触发事件后的操作流程更加的清晰Channel模块是用于对一个描述符所需要监控的事件以及事件触发之后要执行的回调函数进行管理的原创 2025-03-31 22:18:44 · 932 阅读 · 4 评论 -
Muduo网络库实现 [三] - Socket模块
Socket模块主要是对套接字的基础操作进行封装,简化我们对套接字的操作,不需要调用C的原生接口,而是以面向对象的方式来调用。 那么我们需要封装哪些接口呢?首先,最基础的接口,创建套接字,绑定地址信息,建立连接,开始监听,获取新连接,读取数据,写入数据,关闭套接字这几个基本功能我们还是需要提供的。其次就是两个特殊的功能: 设置套接字非阻塞,因为后续我们读取和写入都是非阻塞进行的。 还有就是设置地址信息和端口号复用,这是为了便于服务器崩溃之后能够立即以固定端口重启。还需要提供两个集成的功能,创建一原创 2025-03-31 18:05:17 · 1076 阅读 · 0 评论 -
Muduo网络库实现 [二] - Buffer模块
Buffer模块是用于通信套接字的缓冲区,用于用户态的输入输出的数据缓存。为什么要有用户态的输入缓冲区?TCP协议是字节流的,我们无法保证一次收到的数据就刚好是一个完整的报文。 但是我们从TCP的输出缓冲区提取出来之后,在TCP的内核缓冲区中就已经将读取出来的数据无效了,那么我们就势必需要一个用户态的缓冲区用于应对这种情况。那么为什么需要用户态输出缓冲区呢? 因为如果我们直接向套接字的输出缓冲区写入的话,有可能写条件并不具备,那么这时候我们就会阻塞在写入或者说写入失败,这两种情况要么就是降低了效率,原创 2025-03-30 23:28:53 · 978 阅读 · 3 评论