🌈个人主页:Fan_558
🔥 系列专栏:仿muduo
📒代码仓库: 项目代码
🌹关注我💪🏻带你学更多知识
文章目录
- 前言
- Channel模块
- 设计原因
- 整体设计
- 代码如下
- Connection模块
- 设计原因
- 整体设计
- 代码如下
- 小结
前言
本文的核心模块是Connection模块,该模块实现了对一个通信套接字的整体管理,未来获取到新连接,每一个新连接都会设置一个connection进行管理,connection模块中包含了我们对连接的操作,以及对可读可写错误任意事件的设置
Channel模块
设计原因
当一个描述符已经监控了可写事件,如果我们又要去写入数据到发送缓冲区,没有必要再去监控一次可写事件,已经设置了就不需要重复设置,否则系统也会有消耗的,为了减少该消耗,所以我们就需要对描述符监控的事件进行管理,只需要判断是否已经监控了某个事件,没有就去监控一下,已经监控了就不需要再次监控了 并且在该模块当中设置触发对应事件的回调函数
整体设计
Channel模块的主要作用:一是对监控事件的管理(可以判断是否可读可写,也可以对一个事件解除、添加可读/可写监控),二是在此模块设置许多对应事件的回调机制(具体的业务函数由用户传入)
函数接口:
代码如下
Connection模块
设计原因
设计原因:再一次进行封装,使操作更加简便
Connection模块是对Buffer模块,Socket模块,Channel模块的⼀个整体封装,实现了对⼀个通信套接字的整体的管理,每⼀个进⾏数据通信的套接字(也就是accept获取到的新连接)都会使⽤Connection进⾏管理。
一个连接有任何的事件该怎么处理都是由这个模块来进行处理的,因为组件的设计者也不知道使用者要如何处理事件,因此只是提供一些事件回调函数,再由使用者设置具体的业务处理
怎么理解connection模块也是对Buffer模块,Socket模块,Channel模块的⼀个整体封装?
我们需要对触发了什么事件设置相应的回调,像HandleRead读事件回调需要涉及将socket中的数据放入到接收缓冲区,如果读取数据出错了就需要涉及到连接的操作,比如关闭连接
读入到缓冲区后我们就需要对缓冲区的数据进行处理—调用_message_cb_usr处理数据
因此事件的回调函数我们需要用到多个模块结合,恰恰connection模块也是对Buffer模块,Socket模块,Channel模块的⼀个整体封装
整体设计
事件回调函数的设置:
这里的函数是设置回给Channel模块可读可写关闭错误事件的
HandleRead、HandleWrite、HandleClose、HandleError
设置对于连接操作的各种回调:
这些对连接操作的各种回调(建立连接、数据处理、关闭连接、任意事件、移除服务器内部管理的连接信息)
都是由服务端进行设置的,比如一个游戏服务端,当你上线了,可能会跳出一大堆签到的东西,当你关闭游戏
的时候,可能会出现让你确定是否关闭的消息,因此对连接的操作的回调还是得由具体的用户设置
EstablishedCallBack _established_cb_usr;
MessageCallBack _message_cb_usr;
ClosedCallBack _closed_cb_usr;
AnyEventCallBack _anyevent_cb_usr;
ClosedCallBack _close_cb_svr;
对连接的管理操作:
这里要设置为私有的(private),因为这些函数是对连接的操作存在线程安全问题
EstablishedPriv、ReleasePriv、ShutdownPriv、CloseInactiveReleasePriv、StartInacyiveReleasePriv
因此这里也会给一系列公有接口Shutdown、CloseInactiveRelease…
这些公有接口的设计就需要把对连接的操作(比如EstablishedPriv,ReleasePriv)压入任务队列里(由EventLoop模块提供压入任务队列的接口)
代码如下
小结
本文就到这里结束了,如果本文存在疏漏或错误的地方,还请您能够指出,另外地,欢迎在评论区中交流