文档章节

asio::async_write 的坑

梦想游戏人
 梦想游戏人
发布于 09/27 10:41
字数 211
阅读 93
收藏 0

同一个socket 的async_write操作内部是调用async_write_some 去执行的,在WriteDone之前,如果再次调用async_write 会导致 发送的stream顺序错乱, 典型复现是,

boost::asio::async_write(socket, buffer(xxx, 1024000), yield[ec]);
boost::asio::async_write(socket, buffer(buf, 32), std::bind(&Session::write, this, std::placeholders::_1, std::placeholders::_2));


客户端收到的 数据就会乱掉,

解决方案:

添加发送队列就好了

void CAsioSession4S::HandleWriteDone(const boost::system::error_code &ec)
{
	if (this->_sending != nullptr)
	{
		delete this->_sending;
		this->_sending = nullptr;
	}
	//error will disconnected
	if (ec)
	{
		while (!_sendQueue.empty())
		{
			delete _sendQueue.front();
			_sendQueue.pop();
		}
		this->Disconnect();
		return;
	}
	//检查发送队列
	if (!_sendQueue.empty())
	{
		this->_sending = _sendQueue.front();
		_sendQueue.pop();
		boost::asio::async_write((*_socket.get()), this->_sending->send, std::bind(&CAsioSession4S::HandleWriteDone, this->shared_from_this(), std::placeholders::_1));
	}
}

 

© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 36
博文 433
码字总数 123540
作品 0
成都
私信 提问
C++网络和IO开发包--Asio

Asio 是一个跨平台的C++开发包用来处理网络和低级I/O编程,通过先进的C++方法为开发人员提供连续异步模型。 示例代码: void handleread(const asio::errorcode& error, sizet bytestransfe...

匿名
2010/05/28
15.6K
0
Boost.Asio技术文档

Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE10.txt文件或从http://www.boost.org/LICENSE1_0.txt) Boost.Asio是用......

LUIS1983
2016/12/23
20
0
boost------asio库的使用2(Boost程序库完全开发指南)读书笔记

网络通信 asio库支持TCP、UDP、ICMP通信协议,它在名字空间boost::asio::ip里提供了大量的网络通信方面的函数和类,很好地封装了原始的Berkeley Socket Api,展现给asio用户一个方便易用且健...

LUIS1983
2016/12/23
14
0
Boost ASIO proactor 浅析

Boost ASIO proactor 浅析 前情提要: Boost asio 的socket的异步非阻塞模式才有的是proactor模式,当IO操作介绍后回调相应的处理函数。ASIO在Linux平台下的实现基于epoll,但是epoll只支持r...

晨曦之光
2012/06/07
492
0
Boost asio 心得笔记

Boost asio中有两点用的不爽: 1. asio中的所有对象都引用io_service 2. async_write还要自己保证内存在completed之前有效 有空要把这两点搞的更傻瓜一点,实际上在全异步模式下NET IO分配两个...

晨曦之光
2012/06/07
742
0

没有更多内容

加载失败,请刷新页面

加载更多

day150-2018-11-17-英语流利阅读-待学习

歪果仁也疯狂:海外版抖音的征途 毛西 2018-11-17 1.今日导读 海外版抖音 TikTok 于 2017 年 5 月上线海外,至今覆盖全球 150 多个国家和地区,月活跃用户数已突破 5 亿。然而,“出海”的抖...

飞鱼说编程
今天
4
0
分布式学习最佳实践:从分布式系统的特征开始(附思维导图)

什么是分布式系统 回到顶部   分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法...

dragon_tech
今天
4
0
TOKEN设计

TOKEN设计 Api_Token 首先需要知道API是什么? API(Application Programming Interface)即应用程序接口。你可以认为 API 是一个软件组件或是一个 Web 服务与外界进行的交互的接口。而我们在...

DrChenXX
今天
3
0
浅谈“李氏代换”——从纪念金庸和斯坦李说起

李氏代换(LSP)简介 李氏代换是软件设计的一个原则,又名依赖倒转原则或依赖倒置原则,其衍生原则有接口分离原则等。该原则由Barbara Liskov于1988年提出。 该原则指出,程序中高级别的元素...

SamYjy
今天
33
0
JavaScript实现在线websocket WSS测试工具 -toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部