muduo网络库学习笔记
文章平均质量分 96
Still_Believe_
爱好编程C++,Java,Python。github主页:https://github.com/klc407073648
展开
-
《muduo网络库》学习笔记——线程安全的对象生命期管理
当析构函数遇到多线程:当一个对象能被多个线程同时看到,那么对象的销毁时机就会变得模糊不清,可能出现多种竞态条件(race condition)在即将析构一个对象时,如何知道此时是否有别的线程正在执行该对象的成员函数? 如何保证在执行成员函数期间,对象不会被另一个线程析构? 在调用某个对象的成员函数之前,如何得知该对象还活着?它的析构函数会不会碰巧执行到一半?解决这些race condition是C++多线程编程面临的基本问题?可以尝试通过智能指针shared_ptr解决上述问题。...原创 2020-12-13 10:09:53 · 209 阅读 · 0 评论 -
《muduo网络库》学习笔记——消息广播服务
本文介绍如何使用muduo实现一个简单的 topic-based 消息广播服务。消息广播服务其实是“聊天室”的一个简单扩展,不过聊天的不是人,而是分布式系统中的程序。在分布式系统中,除了常用的 end-to-end 通信,还有一对多的广播通信。本文讨论的是基于 TCP 协议的应用层广播。示意图如下:上图中圆角矩形代表程序,"Hub"是一个服务程序,不是网络集线器,它起到类似集线器的作用,故而得名。Publisher 和 Subscriper 通过 TCP 协议与 Hub 程序通信。Publish原创 2020-12-08 07:56:10 · 316 阅读 · 0 评论 -
《muduo网络库》学习笔记——时间轮Timeing wheel
目录1. 概述2. Timing wheel 原理2.1 连接超时被踢掉的过程2.2 连接刷新2.3 多个连接3. 代码实现与分析1. 概述本文介绍如何使用 timing wheel 来踢掉空闲的连接,一个连接如果若干秒没有收到数据,就认为是空闲连接。代码见examples/idleconnection。在严肃的网络程序中,应用层的心跳协议是必不可少的。应该用心跳消息来判断对方进程是否能正常工作,“踢掉空闲连接”只是权宜之计。如果一个连接在连续几秒时间内没有收到数据,就默原创 2020-12-05 10:07:54 · 724 阅读 · 0 评论 -
《muduo网络库》学习笔记——muduo学习总结
muduo是基于非阻塞的IO和事件驱动的网络库(Reactor模式),其核心是一个事件循环EventLoop,用于响应计时器和IO事件。muduo采用基于对象(object-based)而非面向对象(object-oriented)的设计风格,其事件回调接口多以boost::function+boost::bind表达,用户在使用muduo的时候不需要继承其中的class,其总体结构是 one loop per thread+threadpool,描述如下:其中,mainReactor和subRea原创 2020-12-03 08:08:43 · 779 阅读 · 0 评论 -
《muduo网络库》学习笔记——TcpClient剖析
muduo用TcpClient发起连接,TcpClient有一个Connector连接器,TcpClient使用Connector发起连接, 连接建立成功后, 用socket创建TcpConnection来管理连接, 每个TcpClient class只管理一个TcpConnecction,连接建立成功后设置相应的回调函数。很显然,TcpClient用来管理客户端连接,真正连接交给Connector。调用过程如下:TcpClient::connect()——>Connector::start()—原创 2020-12-03 07:29:12 · 484 阅读 · 0 评论 -
《muduo网络库》学习笔记——Connector剖析
Connector剖析Connector负责主动发起连接,不负责创建socket,只负责连接的建立,外部调用Connector::start就可以发起连接,Connector具有重连的功能和停止连接的功能,连接成功建立后返回到TcpClient。与Acceptor 相比少了一个acceptSocket_成员,因为Connector 是创建一个新的sockfd 并connect 它,创建过程如下:Connector::start()-->Connector::startInLoop()--&..原创 2020-12-02 08:05:05 · 359 阅读 · 0 评论 -
《muduo网络库》学习笔记——实现TCP网络库和核心类介绍
1. 实现TCP网络库在muduo中,Reactor事件处理框架如下所示,从poll返回到再次调用poll阻塞称为一次事件循环。不同于传统的Reactor,将timers 做成循环中单独的一步,muduo将 timers 和IO handlers 视为等同的。2. AcceptorAcceptor class 用于 accept 新的TCP 连接, 并通过回调通知使用者。它是一个内部class ,供 Tcpserver 使用,且生命期由 Tcpserver控制。其定义如下:class原创 2020-12-01 08:01:07 · 392 阅读 · 0 评论 -
《muduo网络库》学习笔记——EventLoopThread和EventLoopThreadPool剖析
目录1.EventLoopThread2.EventLoopThreadPool1.EventLoopThreadEventLoopThread是事件循环线程,包含一个Thread对象和一个EventLoop对象。在构造函数中,把EventLoopThread::threadFunc注册到Thread对象中,在EventLoopThread::startLoop()函数中进行回调。EventLoopThread的工作流程为:在主线程创建EventLoopThread对象。 ...原创 2020-11-29 10:16:47 · 447 阅读 · 0 评论 -
《muduo网络库》学习笔记——EventLoop类剖析
目录一:采用的线程通信机制二:EventLoop剖析一:采用的线程通信机制首先来看一下一个进程(线程)如何通知另一个个等待中的(线程),有三种方法:pipe,使用fd[0] 为读端,fd[1]为写端,半双工。等待线程关注fd[0]的可读事件。 socketpair,也有一对文件描述符,可用于双向通信,全双工。 eventfd。eventfd是一个比pipe更高效的线程间事件通知机制,一方面它比 pipe少用一个pipe descriptor,节省了资源。另一方面,eventfd的缓冲原创 2020-11-27 22:46:01 · 693 阅读 · 3 评论 -
《muduo网络库》学习笔记——Protobuf网络传输和Protobuf编解码器与消息分发器
1. 一种自动反射消息类型的 Google Protobuf 网络传输方案Google Protocol Buffers (Protobuf) 是一款非常优秀的库,它定义了一种紧凑的可扩展二进制消息格式,特别适合网络数据传输。它为多种语言提供 binding,大大方便了分布式程序的开发,让系统不再局限于用某一种语言来编写。根据 type name 反射自动创建 Message 对象Protobuf本身具有很强的反射(reflection)功能,可以根据 type name 创建具体类型的 Me.原创 2020-11-27 07:34:45 · 899 阅读 · 3 评论 -
《muduo网络库》学习笔记——定时器与TimerQueue
1. muduo库时间函数的选择(计时)只使用 gettimeofday 来获取当前时间。gettimeofday 的分辨率 (resolution) 是 1 微秒,足以满足日常计时的需要。muduo::Timestamp 用一个 int64_t 来表示从 Epoch 到现在的微秒数,其范围可达上下 30 万年。 (定时)只使用 timerfd_* 系列函数来处理定时。(timerfd_create / timerfd_gettime / timerfd_settime)timerfd_create原创 2020-11-24 08:11:48 · 277 阅读 · 0 评论 -
《muduo网络库》学习笔记——muduo网络库的设计与实现
目录Reactor 介绍单线程Reactor实现EventLoop类Channel 类Poller类Reactor 介绍Reactor模式用 非阻塞IO + poll(epoll)函数来处理并发,程序的基本结构是一个事件循环,以事件驱动和事件回调的方式实现业务逻辑。可参考《基于I/O复用的Reactor模式》。while(!done){ int retval = poll(fds,nfds,timeout) if(retval < 0) ...原创 2020-11-22 19:06:59 · 408 阅读 · 0 评论 -
《muduo网络库》学习笔记——Buffer类的设计
目录1. muduo的Buffer设计1.1 muduo的IO模型1.2 为什么 non-blocking 网络编程中应用层 buffer 是必须的?1.3 Buffer的功能需求2. Buffer 的数据结构3. 其他Buffer的设计方案1. muduo的Buffer设计Buffer类的设计,即输入输出缓冲区的设计,其中buffer 指一般的应用层缓冲区、缓冲技术。1.1 muduo的IO模型Unix/Linux 上的五种 IO 模型:阻塞(blocking...原创 2020-11-20 21:39:40 · 1106 阅读 · 1 评论