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_