diff --git a/muduo/net/Buffer.cc b/muduo/net/Buffer.cc index 7c921fc40..2628d20de 100644 --- a/muduo/net/Buffer.cc +++ b/muduo/net/Buffer.cc @@ -13,6 +13,7 @@ #include #include +#include using namespace muduo; using namespace muduo::net; @@ -56,3 +57,12 @@ ssize_t Buffer::readFd(int fd, int* savedErrno) return n; } +ssize_t Buffer::writeFd(int fd, int* savedErrno) +{ + ssize_t n = ::write(fd, peek(), readableBytes()); + if (n < 0) + { + *savedErrno = errno; + } + return n; +} diff --git a/muduo/net/Buffer.h b/muduo/net/Buffer.h index 4fa82d4bd..87efef332 100644 --- a/muduo/net/Buffer.h +++ b/muduo/net/Buffer.h @@ -379,6 +379,9 @@ class Buffer : public muduo::copyable /// @return result of read(2), @c errno is saved ssize_t readFd(int fd, int* savedErrno); + // Send data by fd. + ssize_t writeFd(int fd, int* savedErrno); + private: char* begin() diff --git a/muduo/net/TcpConnection.cc b/muduo/net/TcpConnection.cc index 37f58a452..429d3a12d 100644 --- a/muduo/net/TcpConnection.cc +++ b/muduo/net/TcpConnection.cc @@ -370,9 +370,8 @@ void TcpConnection::handleWrite() loop_->assertInLoopThread(); if (channel_->isWriting()) { - ssize_t n = sockets::write(channel_->fd(), - outputBuffer_.peek(), - outputBuffer_.readableBytes()); + int savedErrno = 0; + ssize_t n = outputBuffer_.writeFd(channel_->fd(), &savedErrno); if (n > 0) { outputBuffer_.retrieve(n);