![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
muduo库
文章平均质量分 85
muduo学习,base组件(线程设施、日志库、util等),net组件(Eventloop,TcpServer,TcpCLient等),HttpServer应用
aworkholic
路漫漫其修远兮,吾将上下而求索
展开
-
mudo学习笔记汇总
muduo学习汇总目录原创 2021-07-19 20:26:46 · 965 阅读 · 3 评论 -
muduo学习笔记:net部分之Http--HttpServer
前面【muduo学习笔记:net部分之Http–HttpRequest、HttpResponse 和 HttpContext】介绍了TCP数据数据Buffer承载的HTTP报文的解析,本文结合TcpServer,基于muduo实现一个简单的HttpServer。由于对协议解析不完善,它不适合写web的通用服务。1、HttpServer的定义有了TcpServer的基础,加上前面博客关于HttpRequest、HttpResponse 和 HttpContext的使用,我们可以封装一个HttpServe原创 2021-09-06 21:56:54 · 867 阅读 · 0 评论 -
muduo学习笔记:net部分之Http--HttpRequest、HttpResponse 和 HttpContext
前文[【muduo学习笔记:net部分之Http-协议简介】]简单介绍了HTTP的协议,本文使用muduo网络库简单实现HTTP的请求体和响应体。客户端发送请求,通过muduo库之后服务端收到的数据存放于`Buffer`中,之后解析成`HttpRequest`请求对象,再创建一个`HttpResponse`响应对象并格式化成`Buffer`返回给客户端。服务端解析客户端请求的Buffer使用`HttpContext`类。原创 2021-09-06 21:53:43 · 1465 阅读 · 0 评论 -
muduo学习笔记:net部分之Http-协议简介
HTTP协议(HyperText Transfer Protocol,超文本传输协议)目前是互联网上应用最为广泛的一种网络传输协议,基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),最新已经发展到基于UDP/QUICK的HTTP/3版本,目前协议版本多使用1.1。另外,本文不介绍HTTPS基于SSL/TLS加密。HTTP协议是基于文本的,也就是TCP传输主要是文本(数据部分可能是二进制数据),HTTP消息分为请求Request、响应Response两种。HTTP的请求由客户端原创 2021-09-06 21:50:17 · 573 阅读 · 0 评论 -
muduo学习笔记:net部分之实现TCP网络编程库-TcpClient
有了前文【muduo学习笔记:net部分之实现TCP网络编程库-Connector】的介绍,TcpClient的实现就不难了。muduo用TcpClient发起连接,TcpClient有一个Connector连接器,TCPClient使用Conneccor发起连接, 连接建立成功后, 用socket创建TcpConnection来管理连接, 每个TcpClient class只管理一个TcpConnecction,连接建立成功后设置相应的回调函数。很显然,TcpClient用来管理客户端连接,真正连接交给C原创 2021-09-04 14:03:55 · 458 阅读 · 0 评论 -
muduo学习笔记:net部分之实现TCP网络编程库-Connector
1https://blog.csdn.net/weixin_36750623/article/details/84639766原创 2021-09-04 00:54:44 · 375 阅读 · 0 评论 -
muduo学习笔记:net部分之实现TCP网络编程库-TcpServer
前文博客【muduo学习笔记:net部分之实现TCP网络编程库TcpConnection】和【muduo学习笔记:net部分之实现TCP网络编程库Acceptor】 是TcpServer是基本组件,博文【muduo学习笔记:net部分之多线程TCP服务端的设计模式演进】介绍了TcpServer的各种设计方式以及muduo网络库的结构。本文主要介绍TcpServer代码结构、工作流程。1、多线程 TcpServer 结构作为服务器端,首先需要封装了listening socket的Acceptor来监听客原创 2021-09-01 21:06:01 · 773 阅读 · 2 评论 -
muduo学习笔记:net部分之实现TCP网络编程库-TcpConnection
TcpConnection是TCP网络库的核心,封装了一次TCP连接,但是它不能发起连接。当TcpServer和TcpCliet成功建立连接后,都会通过TcpConnection对象进行收发数据通信。1、TCP连接的建立、断开流程TcpServer新建连接的函数相关调用时序见下图。...原创 2021-08-31 23:35:34 · 655 阅读 · 2 评论 -
muduo学习笔记:net部分之实现TCP网络编程库-Acceptor
前述文章围绕base、net两个模块各种组件,已经形成了初具规模的Reactor事件处理框架。从现在开始,逐步实现一个非阻塞的TCP网络编程库。原创 2021-08-27 22:59:17 · 338 阅读 · 0 评论 -
muduo学习笔记:net部分之实现TCP网络编程库-Buffer
non-blocking IO的核心思想是避免阻塞在read()或write()或其他IO系统调用上,这样可以最大限度地复用thread-of-control。让一个线程能服务于多个socket连接。IO线程只能阻塞在IO multiplexing函数上,如select/poll/epoll_wait。这样一来,应用层的缓冲是必需的,每个TCP socket都要有stateful的input buffer和output buffer。...原创 2021-08-25 20:23:44 · 991 阅读 · 0 评论 -
muduo学习笔记:net部分之多线程TCP服务端的设计模式演进
文章目录1、阻塞式的方案2、非阻塞式的方案2.1、单线程Reactor2.2、单线程Reactor + thread2.3、单线程Reactor + prethread2.4、单线程Reactor + work thread pool2.5、Multiple Reactors(moduo默认线程模型)2.6、Multiple Reactors + work thread pool【muduo学习笔记:net部分之EventLoopThread和EventThreadPool】介绍事件循环的线程池,这里以m原创 2021-08-25 20:20:04 · 399 阅读 · 0 评论 -
muduo学习笔记:net部分之EventLoopThread和EventThreadPool
前文【muduo学习笔记:net部分之EventLoop】介绍了EventLoop的原理实现和基本使用。任何一个创建并运行了EventLoop的线程就是IO线程,在任何线程中都可以创建运行EventLoop。在一个程序中,可能不止一个IO线程,IO线程也比一定是主线程。为方便多线程使用,EventloopThread类封装了IO线程,该类创建了一个线程,并在线程函数中创建了一个Eventloop对象并执行事件循环。EventThreadPool是封装了多个EventLoop的线程池,主要用在多线程TCP服原创 2021-08-21 23:37:19 · 495 阅读 · 2 评论 -
muduo学习笔记:net部分之EventLoop
EventLoop的事件循环主要两个大部分:第一个部分,`Poller`监听`socketfd`、`timerfd`封装的`Channel`事件(网络事件、定时器事件),并执行对应IO事件的回调函数;第二个部分,在IO线程空闲时执行一些计算任务,充分利用线程资源。由于`Poller`是阻塞等待IO事件的,当有计算任务时需要被唤醒,使用eventfd的Channel的来实现。原创 2021-08-19 19:55:27 · 535 阅读 · 2 评论 -
muduo学习笔记:net部分之Poller
文章目录1、Poller基类1.1、EPollPoller的设计实现1.1.1、poll()函数Poller类是IO multiplexing的封装,是muduo中唯一的一个抽象基类,支持poll和epoll两种派生类实现的IO multiplexing机制。它是EventLoop的间接成员,只供其所属的EventLoop在IO线程中调用,因此无需加锁。其生命周期和EvenLoop相等。Poller并不拥有Channel,Channel在析构前必须自己unregister(EventLoop::remov原创 2021-08-17 20:21:15 · 371 阅读 · 0 评论 -
muduo学习笔记:net部分之Channel
正如其名,muduo中Channel是底层通过Socket建立TCP通信的通道,用于事件分发。Channel对fd的事件相关方法进行了封装,例如负责注册fd的可读或可写事件到EvenLoop,又如fd产生事件后要如何响应。Channel与fd是聚合关系,一个fd对应一个channel,不实际拥有fd,Channel析构是不会close当前fd。文件描述符fd可以是socket、eventfd、timerfd或signalfd。Channel一般作为其他类的成员,不被直接使用,而使用更上层的封装,例如用于原创 2021-08-12 22:29:41 · 627 阅读 · 0 评论 -
muduo学习笔记:net部分之Socket、SocketsOpts和InetAddress
muduo实现非阻塞的TCP连接,对socket相关内容进行了非常详尽的封装,主要封装Socket、SocketsOpts和InetAddress。另外在Socket使用了Endian的跨平台使用的大小端转换函数。有关socket网络编程更详尽的介绍和使用,可以参考专栏【socket网络编程】。1、SocketSocket类是封装了socket文件描述符的类,通过RAII实现了声明周期的管理,在对象析构时自动关闭socket描述符。该类仅提接口,具体操作均封装在了SocketsOpts中。class原创 2021-08-10 20:35:58 · 357 阅读 · 0 评论 -
muduo学习笔记:net部分之TimerQueue定时器(含Timer和TimerId)
一个TimerQueue只属于一个EventLoop,它维护了多个定时器Timer对象,但是仅创建了一个timerfd构造成一个Channel,并交由EventLoop的Pooler监听事件。当第一个Timer加入TimerQueue后,就启动timerfd,当timerfd可读事件触发(定时的过期时间已到),就执行当前Timer的回调函数。有多个任务加入,就将timerfd触发的定时时间更新为距当前时间最近的Timer过期时间,当定时器需要repeat周期执行时,将重置其Timer的过期时间。1、介绍t原创 2021-08-09 21:19:27 · 1024 阅读 · 0 评论 -
muduo学习笔记:基于事件驱动的Reactor设计-整体框架
文章目录muduo库整体架构代码结构base基础库net基础库附属库网络库结构EvenLoopChannelSocketTcpConectionAccepterConnector并发网络库的设计方案有很多,现代多线程TCP网络编程基本使用非阻塞的poll/epoll(IO multiplexing多路复用器)轮训监听(Reactor)有无SOCKET读写IO事件, 将IO事件的处理回调的分发到线程池中,实现异步返回结果。muduo是基于Reactor模式的网络库,核心是事件循环EventLoop,响应I原创 2021-08-06 23:04:56 · 563 阅读 · 0 评论 -
muduo学习笔记:base部分之高性能日志库-AsyncLogging
https://blog.csdn.net/q5707802/article/details/79277665原创 2021-08-04 23:13:59 · 692 阅读 · 0 评论 -
muduo学习笔记:base部分之高性能日志库-LogFile
LogFIle类是muduo日志库后端的实际管理者,主要负责日志的滚动。内部的AppendFile类型成员变量是最终用于操作本地文件的类,负责将日志数据写入本地文件,记录写入的日志总长度。代码类结构如下:1、AppendFile类AppendFile类位于moduo::FileUtil命名空间。由于写日志到缓冲中使用非加锁的fwrite函数,因此要求外部单线程处理或加锁,保证缓冲区日志不会发生交织混乱。功能单一,直接上代码和注释,如下。class AppendFile : noncopyable原创 2021-08-02 23:37:10 · 544 阅读 · 0 评论 -
muduo学习笔记:base部分之高性能日志库-Logger
前面介绍了【muduo学习笔记:base部分之高性能日志库-LogStream】前端中的LogStream类,本文接受日志前端的管理对象Logger,代码位于 muduo/base/Logging.{h, cc}。整体功能如下图:Logger负责全局的日志级别、输出目的地设置(静态成员函数),实际的数据流处理由Impl内部类实现。Imp的成员变量LogSteam对象是实际的缓存处理对象,包含了日志信息的加工,通过Logger的stream()函数取得实现各种日志宏功能。当Logger对象析构时,将LogS原创 2021-08-01 22:29:02 · 936 阅读 · 1 评论 -
muduo学习笔记:base部分之高性能日志库-LogStream
muduo日志库是C++ stream风格,用起来自然,不必费心保持格式字符串和参数类型的一致性,可以随用随写,而且是类型安全的。stream风格的另一个好处是当输出的日志级别高于语句的日志级别是,打印日志是个空操作,运行开销接近零,而printf风格不易做到。muduo没有用到标准库的iostream,而是自己写的LogStream类,这主要是出于性能。设计这个LogStream类,让它如同C++的标准输出流对象cout,能用<<符号接收输入,cout是输出到终端,而LogStream类原创 2021-07-29 21:39:59 · 991 阅读 · 3 评论 -
muduo学习笔记:base部分之高性能日志库
服务端编程,日志必不可少,生产环境中应做到"Log Everything All The Time"。一个日志库答题分为前端(Logging.{h,cc})和后端(LogFile.{h,cc})两部分。前端是供应用程序使用的接口,生成日志消息;后端则负责把日志消息消息写到目的地。muduo日志库采用C++的stream << 风格,出于性能原因未使用标准库iostream而使用自己写的LogStream class。在多线程程序中,每个线程有自己的前端,整个程序共用一个后端。但难点在于将日原创 2021-07-28 23:23:12 · 1064 阅读 · 1 评论 -
muduo学习笔记:base部分之线程池ThreadPool类
背景:为同时执行多个任务(较小时,并行处理次数较少时),最直接的办法是直接开启对应数量的线程。一旦任务多、并行频繁,线程资源的创建与销毁的时间消耗、上下文切换资源占用就存在问题。引入线程池就是解决这一问题,一种简单的策略是,提前分配一定数量的线程,依次从任务队列中拿出一个任务到线程中执行。ThreadPool类维护了一个任务队列、一个线程数组,还有一个消费线程用来从队列中获取任务并选择空闲的线程执行。muduo库实现的ThreadPool类,一旦传递 std::function<void ()&原创 2021-07-27 22:22:08 · 588 阅读 · 1 评论 -
muduo学习笔记:base部分之BlockingQueue类、BoundedBlockingQueue类
队列是一种先入先出的容器,通常应用在生产者-消费者模型中。由于在多线程中需要保证数据安全,因此需要利用互斥锁对队列操作进行加锁;当生产较慢时,消费者不能使用耗费资源的轮询操作判断是否有新数据的到来,需要利用条件变量阻塞等待数据到来的通知。以上就是线程安全阻塞队列BlockingQueue类是实现,而BoundedBlockingQueue类就是有界(队列元素个数有限)线程安全阻塞队列的实现。在moduo库中,通常的入队的操作要小于出队的操作。1、BlockingQueue类线程安全、阻塞的队列。队列使原创 2021-07-26 23:08:44 · 354 阅读 · 0 评论 -
muduo学习笔记:base部分之Atomic、Mutex、Condition、CountDownlatch等线程相关类
muduo库中线程同步异步需要基本组件Atomic、Mutex、Condition、CountDownlatch,在Thread、ThreadPool、BlockQueue等基本组件中均有使用。前三者主要用于线程间同步、保护资源竞争,使用C语言的方式实现;后者CountDownlatch利用前三者,实现等待多任务或多线程执行准备就绪后通知当前线程继续执行的功能。在c++11中,可以直接使用 std::atomic<>、std::mutex、std::condition_variable等来实现原创 2021-07-25 11:28:21 · 376 阅读 · 1 评论 -
muduo学习笔记:base部分之Data类、TimeZone类
文章 【muduo学习笔记:base部分之Timestamp类】 中介绍了Timestamp类,用于表示格林威治时间的时间戳。本文进一步介绍,Data类以记录GMT日期,TimeZone以记录GMT时间与UTC时间转换。1、Data类日期是采用Julian day来表示的,现在到儒略历的公元前4713年1月1日中午12点(在格里历是公元前4714年11月24日)的天数,具体可以参考维基百科或百度百科,主要在天文学中使用。1.1、Data类定义私有成员变量julianDayNumber_存储着这个天数原创 2021-07-23 23:35:12 · 365 阅读 · 2 评论 -
muduo学习笔记:base部分之CurrentThread命名空间与Thread类
muduo的Thread是pthread的封装,实现了线程的基本操作,已经CurrentThread命名空间有关线程id管理和优化。原创 2021-07-22 20:03:13 · 672 阅读 · 2 评论 -
muduo学习笔记:base部分之Timestamp类
Timestamp类主要用于日志、定时器模块中记录时间戳、打印时间戳字符串,Timestamp类包含以下4个的文件:muduo/base/Timestamp.ccmuduo/base/Timestamp.hmuduo/base/copyable.hmuduo/base/Types.hcopyable.h文件中包括的空类是一个标识类,表示继承该类的所有类都是可复制的,是值语义。Types.h文件主要使用了该文件中对string类的包含、跨平台数据类型定义以及类型转换函数模板。1、Timesta原创 2021-07-19 20:29:31 · 483 阅读 · 0 评论