asio::async_write 的坑

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

同一个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));
	}
}

 

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看