模拟单线程情况下muduo库的工作情况
在上篇中,笔者追踪了Connetfd(连接套接字)和Listenfd(监听套接字)的Channel对象加入到loop循环的过程。其中包括了网络连接过程中,muduo会创建的对象。本文将会追踪Connetfd(连接套接字)和Listenfd(监听套接字)从loop循环退出并且销毁,一直到main函数终止的过程。
连接套接字正常情况下完整的销毁情况(read == 0)
由TcpConnection对象向自己所拥有的Channel对象注册的可读事件结束时,会出现read == 0
的情况,此时会直接调用TcpConnection对象的handleClose函数。因为在向Channel对象注册可读事件时,使用了如下的语句:
channel_->setReadCallback(&TcpConnection::handleRead,this);
this使得Channel对象可以直接在TcpConnection向它注册的handleClose函数内部使用TcpConnetion的函数。
void TcpConnection::handleRead(Timestamp receiveTime)
{
//都是向channel注册的函数
loop_->assertInLoopThread();//断言在loop线程
int savedErrno = 0;//在读取数据之后调用用户提供的回调函数
ssize_t n = inputBuffer_.readFd(channel_->fd(), &savedErrno);
if (n > 0)
{
//这个应该时用户提供的处理信息的回调函数
messageCallback_(shared_from_this(), &inputBuffer_, receiveTime);
}
else if (n == 0)
{
//读到了0,直接关闭
handleClose();
}
else
{
//如果有错误
errno = savedErrno;
LOG_SYSERR << "TcpConnection::handleRead";
handleError();//处理关闭
}
}
void TcpConnection::handleClose()
{
//处理关闭事件
loop_->assertInLoopThread();//断言是否在loop线程
LOG_TRACE