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中移除。

 

 

你可能感兴趣的:(Muduo库的连接建立和连接断开流程)