ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

(P26)muduo_base库源码分析

2021-06-12 10:33:22  阅读:232  来源: 互联网

标签:muduo TcpConnection EventLoop Connector 源码 P26 Poller Channel Acceptor


文章目录

1.muduo网络库的类图

  • 类图如下:
    在这里插入图片描述

  • 解释如下:
    灰色是内部类,对外不可见;
    白色是外部类,对外可见;

  • EventLoop类
    EventLoop是对事件循环的抽象;

  • Poller类,PollPoller类,EPollPoller类
    (1)下面的三个是muduo唯一使用面向对象编程思想的地方,下面三个类都是内部类,Poller是抽象类,有三个纯虚函数,muduo的对外接口不使用虚函数来暴露的:
    Poller是对I/O复用的抽象;
    PollPoller派生类继承至Poller,是对poll的封装;
    EPollPoller派生类继承至Poller,是对epoll的封装;
    (2)EventLoop与Poller关系是组合,一个EventLoop包含一个Poller(实心表示组合关系),且Poller的生存期由EventLoop来控制,EventLoop的poll函数实际上是调用Poller的poll函数来实现;

  • Channel类
    (1)Channel实际是I/O事件的注册响应封装,update()成员函数负责注册更新I/O可读可写事件,handleEvent()对所发生的I/O事件进行处理;
    (2)update()成员函数负责注册更新I/O可读可写事件时,又会调用到EventLoop.updateChannel(),从而调用Poller.updateChannel(),相当于将Channel注册到Poller中(将/O可读可写事件注册到Poller中);
    (3)一个EventLoop包含多个Channel,即EventLoop可以捕捉多个通道的可读可写事件;
    (4)EventLoop与Channel的关系是聚合关系(空心表示聚合,一对多),EventLoop不负责Channel生存期的控制,Channel的生存期由TcpConnection,Acceptor,Connector这些来控制;
    (5)Channel不拥有fd,其关闭的时候,不用close关闭fd;

  • FileDescriptor
    (1)FileDescriptor不是一个类,与Channel是关联关系,一个Channel拥有一个fd,一个EventLoop拥有多个fd,用来监听多个fd的相关事件;
    (2)FileDescriptor是被Socket所拥有,其生存期由Socket来控制,当Socket对象销毁时,需要close关闭fd;

  • TcpConnection,Acceptor,Connector类
    (1)Channel是TcpConnection,Acceptor,Connector的成员,他们之间的关系是组合;
    (2)Channel的生存期由TcpConnection,Acceptor,Connector这些来控制;
    (3)Acceptor是对被动连接的抽象,它关注的是监听socket的可读事件,监听socket的可读事件由Channel来注册,调用Channel.handleEvent(),从而调用了Acceptor.handleRead(),这是基于对象的编程思想;
    (4)Connector是主动连接的抽象,调用方式与上类似;
    (5)一旦被动连接或者主动连接建立,则会得到已连接socket(获得TcpConnection),对已连接socket的抽象就是TcpConnection;

  • Acceptor,TcpClient类
    (1)TcpServer包含一个Acceptor,TcpClient包含一个Connector;
    (2)组合关系:TcpServer控制Acceptor的生存期,TcpClient控制Connector的生存期;
    (3)聚合关系:一个TcpServer包含多个TcpConnection,但是它不控制TcpConnection的生存期,
    TcpClient类似;

  • Channel其他
    (1)Channel是selectable IO channel,负责注册与响应IO 事件,它不拥有file descriptor。
    (2)Channel是Acceptor、Connector、EventLoop、TimerQueue、TcpConnection的成员,生命期由后者控制。因为EventLoop还包含一个特殊的Channel对象,用来唤醒loop()

2.时序图

EventLoop.loop()实际上是调用Poller.poll()

11:20

标签:muduo,TcpConnection,EventLoop,Connector,源码,P26,Poller,Channel,Acceptor
来源: https://blog.csdn.net/u011436427/article/details/117839195

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有