学习一下muduo网络库(三)

TCP Server实现

TCP server用于管理Acceptor类接受的TCP连接
TCP Server接受连接时的时序图在这里插入图片描述

muduo处理TcpConnection类的关闭采用的是被动关闭,即对方关闭连接,本地read(2)系统调用返回0,触发关闭逻辑,连接关闭的时序图如下
在这里插入图片描述
当TcpConnection从TcpServer中erase()后,如果用户不持有该TcpConnection对象的shared_ptr指针,则其引用计数为1(因为Poller类持有的Channel还有该TcpConnection对象的week_ptr指针,在调用Channel::handleEvent()方法时,会将week_ptr提升为shared_ptr,故引用计数为1)

以下与TcpConnection相关

读取数据时,将数据存放在Buffer类中,缓冲区初始化大小为8+1024字节;通过Buffer::readfd()方法将socketfd中的数据读取到缓冲区,如果初始缓冲区大小不够,该方法会先将数据读取的栈上的char extrabuf[65536]数组中,该数组保证了千兆网(1Gbps)满载时500us的数据输入量( 2 30 / 8 / 2000 ≈ 2 16 2^{30}/8/2000 ≈ 2^{16} 230/8/2000216),因此通常只需调用一次readv(2)。

ssize_t Buffer::readFd(int fd, int* savedErrno)
{
   
  // saved an ioctl()/FIONREAD call to tell how much to read
  char extrabuf[65536];
  struct iovec vec[2];
  const size_t writable = writableBytes();
  vec[0].iov_base = begin()+writerIndex_;
  vec[0].iov_len = writable;
  vec[1].iov_base = extrabuf;
  vec[1].iov_len = sizeof extrabuf;
  // when there is enough space in this buffer, don't read into extrabuf.
  // when extrabuf is used, we read 128k-1 bytes at most.
  const int iovcnt = (writable < sizeof extrabuf) ? 2 : 1;
  const ssize_t n = sockets::readv(fd, vec, iovcnt);
  if (n < 0)
  {
   
    *savedErrno = errno;
  }
  else if (implicit_cast<size_t>(n) <= writable)
  {
   
    writerIndex_ += n;
  }
  else
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值