虎年第一篇博文,有些划水。
对于tcp发送数据以前意识:当用户要求发送一些数据时,发送了多少应该调用完接口马上得知。
今天要使用muduo::net::TcpConnection进行数据发送,发现接口中并没有返回值,也就意味着并不知道数据到底发送了多少(全部还是部分)。
通过查看源码发现,发送了多少内容并没有暴露给用户,而是
(1)在内部进行了管理
nwrote = sockets::write(channel_->fd(), data, len);
if (nwrote >= 0)
{
remaining = len - nwrote;
if (remaining == 0 && writeCompleteCallback_)
{
loop_->queueInLoop(std::bind(writeCompleteCallback_, shared_from_this()));
}
}
(2)当发送失败,会进行标识。
这一部分作者只是进行了标识,并没有发现反馈给用户的接口
else // nwrote < 0
{
nwrote = 0;
if (errno != EWOULDBLOCK)
{
LOG_SYSERR << "TcpConnection::sendInLoop";
if (errno == EPIPE || errno == ECONNRESET) // FIXME: any others?
{
faultError = true;
}
}
}
通过该部分代码,认识到了自己认识的错误,至少不适用muduo的架构。
该架构中的TcpConnection暴露的接口,作者的意图是:用户只管往该TcpConnection中放入数据。
·如果该TcpConnection中的数据全部发送完成,由writeCompleteCallback反馈给用户;
·如果该TcpConnection中的数据已超过要发送数据的上限,由highWaterMarkCallback反馈给用户;