Buffer

Buffer其实像一个queue,从末尾写入数据,从头部读出数据。
Tcp有两个Buffer成员,input buffer与output buffer。
intput buffer,TcpConnection会从socket读取数据,然后写入input buffer(实际为Buffer::readFd()完成的),客户端代码从input buffer读取数据。
output buffer 客户代码会把数据写入到output buffer(实际威TcpConnection::send()完成的),TcpConnection从output buffer读取数据并写入socket

`
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)//Buffer中可以存储所有读到的数据
{
writerIndex_ += n;
}
else//读的数据太多,部分存储到了extrabuf
{
writerIndex_ = buffer_.size();
append(extrabuf, n - writable);
}
readfd()在栈上准备了65536字节的extrabuf,然后利用readv()来读取数据,iovec有两块,第一块威muduo Buffer中的writable字节,另一块指向的是extrabuf,对于读入数据不多的话,那么全部数据读到Buffer,如果长度超过writable的字节,就会读到栈上的extrabuf,然后程序再把extrabuf里的数据append()到Buffer`

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值