你的代码中,调用asio::async_write的回调中,还有判断缓冲中的数据如果没有发生完,接着发送,如:
if (!ec && tcp_sock.is_open() && length > 0 ) {
connection->handle_event(EVT_SEND);
{
ilog("send out length {}",length);
std::lock_guardstd::mutex guard(m.mutex);
m.send_buffer.consume(length);
if (m.send_buffer.size() == 0){
m.is_writing = false;
return ;
}
}
self->do_async_write();
但是asio文档中说,asio::async_write要么发送完所有数据,要么出错,所以,上述异常处理代码是否必要
/// Start an asynchronous operation to write all of the supplied data to a
/// stream.
/**
这个地方不是判断异步io是否发送完所有数据的问题,而是判断send_buffer ,重新发起do_async_write并不在锁的范围内,那么上面那个锁解锁后,发送方可能插入了数据,如果不重新发起write操作,用户的send操作就不会触发write了。这里是多加一层保障。 我这里单线程循环一个context,理论上不应该出现这个问题。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
登录 后才可以发表评论