muduo网络库--客户端视角核心流程与评价

发布时间:2026/10/22 7:25:34
muduo网络库--客户端视角核心流程与评价
1.核心流程1.1.客户端视角1.1.1.服务启动准备EventLoop/EventLoopThreadPool准备一个支持业务处理的BussinessClient含TcpClient成员。TcpClient初始化和EventLoop关联。设置TcpClient的连接事件回调消息事件回调。启动线程运行事件循环1.1.2.主动连接建立流程主动连接建立流程分为发起连接异步任务执行可写事件处理三个阶段发起连接连接标记为true基础连接器内也标记连接投递异步连接任务异步连接任务创建套接字发起连接若反馈失败关闭套接字。业务层无法感知到结果若反馈发起成功设置可写事件回调注册可写监控。设置基础连接器状态为连接中。可写处理若状态为连接中且无异步错误设置状态为已经连接。引发连接回调。TcpClient层回调处理产生基础连接对象设置其连接回调收包回调关闭回调记录基础连接注册可读监控引发业务层连接回调若状态为连接中且存在异步错误。处理如下关闭套接字。设置连接器状态为断开。投递一个延时异步任务。异步任务执行中会再一次发起连接尝试。评价多次并发connect无保护可能产生一个TcpClient引发多次连接回调孤悬Channel等各类问题应用层对连接失败无法感知应用层对自动重连无法感知只有异步连接一种方式1.1.3.数据接收业务包处理流程epoll_wait产生套接字可读事件可读事件处理若读到有效数据引发一次收包回调业务层收包回调中需处理完整包识别构成一个完整包时完整包业务处理接收缓存更新若读到0引发工作线程内连接关闭评价和服务端视角下评价一致1.1.4.数据发送处理流程异步发送任务投递连接状态检测若检测通过则继续。若和关联EventLoop不在一个线程投递异步发送任务若和关联EventLoop在一个线程如消息回调中执行send直接执行发送任务异步发送任务处理若积压数据为0直接写入套接字发送缓存若存在剩余数据剩余数据拷贝到积压缓存若积压缓存不为0且尚未注册可写监控注册可写监控若写入错误工作线程内关闭连接评价服务器视角下所有评价TcpClient未提供发送接口业务层需通过回调上来的基础连接对象的send进行发送接口封装不佳。1.1.5.连接关闭流程连接关闭可以细分为三种类 型工作线程下网络库内部关闭工作线程下业务回调关闭非工作线程下业务侧关闭网络库内部关闭设置状态为关闭取消事件监控引发关闭回调业务层连接关闭回调引发内部关闭回调TcpClient回调处理中移除此持有的连接从复用器对象移除关联Channel业务回调关闭关闭处理为连接状态设置状态为关闭中投递异步关闭任务异步关闭任务处理流程为网络库内部关闭流程非工作线程下业务侧关闭关闭处理状态检测若状态为连接中直接返回设置状态为关闭中投递异步关闭任务异步关闭任务处理流程为网络库内部关闭流程评价服务端视角所有评价TcpClient只提供了shutdown写关闭为提供关闭接口。需业务层借助基础连接对象接口关闭接口封装不佳。1.2.客户端视角下评价并发安全connect不支持并发连接并发connect下行为异常连接事件收包事件断开事件在单个工作线程回调符合串行化。资源管理评价TcpClient/主EventLoop生命期由业务侧管控基础连接对象生命开始TcpClient连接建立回调处理中产生记录到TcpClient对象。生命结束连接关闭中执行了从TcpClient中移除连接业务层不再持有任何此连接智能指针。性能评价接收过程及接收缓存性能不佳发送过程及发送缓存性能不佳任务投递共有线程级任务对象锁竞争较大易用性评价业务层单个收包回调需要处理的事情过多易用性不佳完整包识别完整包的业务处理接收缓存更新一次收到多个包时多个包的拆分connect无并发调用支持connect失败业务侧无法感知易用性不佳connect/disconnect只支持异步调用需业务层自行实现同步语义易用性不佳TcpClient未提供数据发送close接口业务侧需借助回调上来的基础连接对象实现数据发送和关闭易用性不佳