Muduo库的连接建立和连接断开流程

Acceptor类

该类的主要作用在于创建监听描述符,然后注册并监听此描述符。具体即在构造Accept类时,会创建监听描述符,创建acceptSocket,acceptChannel,并将该监听描述符进行bind,为监听描述符的acceptChannelt注册可读回调,(其可读回调为Acceptor类所提供的handleRead接口)。

在创建了Acceptor类之后,即需要向poller注册此描述符和监听了。该类提供listen()接口通过所创建的AcceptChannel对象将该Channel对象注册到poller中,并调用监听描述符的listen操作来监听。

对于acceptChannel注册的handleRead接口,该接口实际上是调用accept接受连接,然后调用TcpServer所提供的newConnection接口。

TcpServer类

该类可以直接被用户所创建并使用,在此类中,拥有Acceptor对象(被TcpServer所唯一拥有,以unique_ptr来管理),TcpServer的作用在于,创建Acceptor对象来创建监听描述符,通过start接口来启动监听,并提供newConnection接口来处理监听描述符在accept新连接之后的连接处理情况。而newConnection的作用在于为新建立的连接创建TcpConnection对象,新建的connection对象的构造函数同时也会为该新连接创建相应的socket和channel对象(关于该对象的管理,全部都是改用共享指针的方式去进行管理,从而便于管理其生命周期),同时将ConnectionCallback,MessageCallback,CloseCallback等注册给该新建立连接的connection对象(这些注册的函数,会在当连接发生IO事件时被调用),然后调用TcpConnection对象所提供的connectEstablished接口。最后,TcpServer会管理一个map,其中保存了所有连接的连接ID和相应的connection对象(以共享指针的形式)

TcpConnection类

此类为整个库的核心类,该类通过状态机以枚举的方式给出了该类对象所处的几种状态,即正在连接,已连接,正在断开,已断开。

连接建立

在newConnection函数中创建TcpConnection对象时,会为此连接创建相应的socket和channel对象,并为channel对象注册readcallback、writecallback、closecallback和errorcallback。这些回调函数都对应于TcpConnection对象的接口,handleRead、handleWrite、handleClose、handleError。当poller返回后,对于某个连接上发生的IO事件,channel的handleEvent函数会根据所发生的IO事件的类型来调用相应回调函数(readcallback等),从而调用TcpConnection对象中的handleRead等函数。而在handleRead等函数中又会调用用户所提供注册的ConnectionCallback、MessageCallback和CloseCallback等函数。

连接断开

连接断开的函数调用栈如下,poller的poll函数返回,某个连接要断开,即其上会发生IO事件,调用该channel的handleEvent函数,然后调用closecallback函数进而调用TcpConnection对象所提供的handleClose函数,该函数会首先将此连接的channel的对象的监听事件设定为不再监听,然后调用注册的CloseCallback函数,该函数会调用TcpServer函数所提供的removeConnection函数,该函数将TcpConnection对象从map中移除掉。(这里需要考虑到connection对象析构的问题,因为是channel的handleEvent调用的这些函数,所以如果在removeConnection中将connection给析构了,也会将相应channel对象给析构,所以这里要注意共享指针的使用),最后queueInLoop就是将TcpConnection::connectionDestroyed函数移动到EventLoop中执行,其执行位置在Channel->handleEvent之后,此时便可以安全的析构TcpConnection。注意queueInLoop函数中bind的conn对象会让共享指针的计数增加,从而延长了TcpConnection对象的生命周期。最后的connectionDestroy的目的是将channel从poll中移除。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值