3,881
社区成员
发帖
与我相关
我的任务
分享
int TcpConnection::write(int *err) {
size_t len = sender_.readable(); // 可发送数据大小
int r_len = len;
int n = -1;
while (true) {
n = ::write(connfd_, sender_.peek() + len - r_len, r_len);
if (n < 0) {
*err = errno;
return n;
}
sender_.retired(n);
r_len -= n;
if (r_len <= 0) {
n = 0;
sender_.retired_all(); // 重置读写指针
break;
}
}
return n;
}
void TcpServer::on_write(TcpConnectionPtr conn) {
int err;
int n = conn->write(&err);
if (n == 0) {
if (conn->keep_alive()) {
if (conn->sender()->readable() == 0) {
mod_fd(conn->fd(), EPOLLIN | kConnEvent);
} else {
mod_fd(conn->fd(), EPOLLOUT | kConnEvent);
}
return;
}
} else if (n < 0) {
if (err == EAGAIN) {
// Continue sending messages
mod_fd(conn->fd(), EPOLLOUT | kConnEvent);
return;
}
}
handle_conn_close(conn);
}