muduo中的TcpServer一次完整的工作(下)

模拟单线程情况下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 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值