muduo学习笔记2

muduo学习笔记2
在服务器端,既需要维护连接的信息,连接发生变化时,还应能通知上面应用层,因此对于事件驱动的服务器,会有各种回调。

muduo中服务器端连接的关闭:

连接关闭的事件来源:

1、底层网络断开,如客户端断开连接,或线路断开,则会在epoll中检测到POLLHUP,Channel在handle该event时,执行closeCallBack回调,从而调用TcpConnection::handleClose();
  TcpConnection::handleClose()
    将自身状态设置为kDisconnected;
    禁用Channel的读写;
    进行connectionCallback_回调:
        connectionCallback_由TcpServer指定,而在TcpServer中connectionCallback_又由用户指定,
因此它实际上是用来通知上层应用程序,连接即将关闭,请进行相关处理;
    进行closeCallback_回调:
        closeCallback_实际上绑定的是TcpServer::removeConnection,也就是TcpServer对TcpConnection的管理。
        首先从连接表中删除该连接,然后在通知TcpConnection对象,你已经从TcpServer中移除了,
请自身再做一些处理,即调用TcpConnection::connectDestroyed()(从EventLoop中删除自身所对应的Channel)。
        closeCallback_放在最后一行执行并用shared_ptr保护起来,使得函数调用完毕、TcpServer中移除了对其的引用后,
自身的内存能得到释放(shared_ptr的引用计数为1)。
POLLHUP event retrieved
    -> Channel::handleEvent
    -> Channel::handleEventWithGuard
        -> Channel::closeCallback_()
        -> TcpConnection::handleClose()
            -> Set State to kDisconnected
            -> Disable channel
            -> connectionCallback_() (customed by application layer)
            -> closeCallback_()
                -> erase from ConnectionMap
                -> TcpConnection::connectDestroyed
                    -> remove channel from eventloop


2、服务器自身的关闭:
    为了优雅的关闭连接,在TcpServer中的析构函数中,会将连接标中的连接一一关闭。因为不同的TcpConnection可能存在于不同IO线程中,因此需要在对应的线程关闭TcpConnection,关闭方法是直接调用TcpConnection::connectDestroyed方法。因为此时TcpConnection此时可能仍然active,因此需要在TcpConnection::connectDestroyed中判断,如果仍avtive则先设置kDisconnected状态,禁用Channel,然后通知应用层。

你可能感兴趣的:(muduo学习笔记2)