muduo中TcpConnection里IO事件的处理

本文详细介绍了muduo库中TcpConnection类如何处理TCP连接上的IO事件,特别是读写操作。TcpConnection维护了两个Buffer对象,分别用于数据的输入和输出。读写事件处理函数handleread和handlewrite将数据存入Buffer,然后进行后续操作。用户通过操作Buffer,而不是直接与socket交互,例如通过messageCallback_函数处理输入数据,send函数用于发送数据,最终调用线程安全的sendInLoop函数。该函数尝试立即发送数据,若未能完全发送则将剩余部分存入outputbuffer,待下次写事件触发继续发送。整个过程,muduo对原生socket的读写进行了全面封装。
摘要由CSDN通过智能技术生成

muduo里面对IO事件的处理核心在TcpConnection里面。因为TcpConnection主要是负责TCP连接,因此有关TCP连接上所有的socket读写都发生在TcpConnection中。根据前一节对Buffer的介绍,在这里我们将会看到muduo是怎么使用Buffer的。

TcpConnection中有两个Buffer对象:

  Buffer inputBuffer_; 
  Buffer outputBuffer_; 

分别负责处理对数据的输入输出。从TcpConnection的构造函数中,我们可以看到TcpConnection的读写事件处理函数为:

void TcpConnection::handleRead(Timestamp receiveTime);
void TcpConnection::handleWrite();

两个函数的实现如下:

void TcpConnection::handleWrite()
{
  loop_->assertInLoopThread();
  if (channel_->isWriting())
  {
    ssize_t n = sockets::write(channel_->fd(),
                               outputBuffer_.peek(),
                               outputBuffer_.readableBytes()); //向chennel_->fd中写数据
    if (n > 0)
    {
      outputBuffer_.retrieve(n); //将已经写入channel_->fd的数据从outbuffer中除去
      if (outputBuffer_.readableBytes() == 0)  //如果outbuffer中已经没有数据了,则将该channel_的写事件从事件循环中去掉
      {
        channel_
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值