文档章节

asio::async_write 的坑

梦想游戏人
 梦想游戏人
发布于 2018/09/27 10:41
字数 211
阅读 139
收藏 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
博文 437
码字总数 124258
作品 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
626
0
boost::asio::buffer() 在BOOST SOCKET 中写时是否多做了一次拷贝?

我们在使用BOOST SOCKET 时,当在一个连接上写数据时,总是将要写的字节流通过boost::asio::buffer() 封装起来然后将返回值做为参数传递给写函数(比如:boost::asio::async_write())。 但是...

su_yh
2016/05/03
408
1

没有更多内容

加载失败,请刷新页面

加载更多

MySQL查询执行

当我们希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理方式...

问题终结者
47分钟前
0
0
CDH5动静态资源池配置与回滚

关于动态 静态资源池的配置以前都有提过,可以从以下几篇了解: YARN动态资源池配置案例 https://yq.aliyun.com/ziliao/346856# Hadoop YARN配置参数剖析(4)—Fair Scheduler相关参数 Hadoop...

hblt-j
52分钟前
3
0
WordPress仿站实战教程

有一个月没有写blog了,一直在学习wordpress的知识,现在能够进行简单的政府企业门户网站的仿制,wordpress的主题订制,一般是对前端要求比较高,wordpress学会了,建站还是非常的快的。下面...

临江仙卜算子
54分钟前
3
0
图像库stb_image

https://github.com/nothings/stb 目前一般主流的图像格式也就是bmp,jpg,png,tga,dds,除了DDS一般是给DX用的,虽然一堆OpenGL程序也有用的,但是我一般只用png和tga, png不用说了,带a...

robslove
今天
1
0
Spring 事务提交回滚源码解析

前言 在上篇文章 Spring 事务初始化源码分析 中分析了 Spring 事务初始化的一个过程,当初始化完成后,Spring 是如何去获取事务,当目标方法异常后,又是如何进行回滚的,又或是目标方法执行...

TSMYK
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部