boost aiso 当接收到数据后,没有及时将数据缓存,将造成数据丢失,请大神帮偶看看

yeti3 发布于 2013/08/28 08:05
阅读 1K+
收藏 0
这是我服务器端收到数据后的回调函数
void InnerSession::handle_read( const boost::system::error_code& error, size_t bytes_transferred )
{
if (error || bytes_transferred == 0)
{
std::cout<<"handle_read Error ID"<<error.value()<<error.message()<<std::endl;
std::cout<<"bytes_transferred is "<<bytes_transferred<<std::endl;
return;
}


if(!HandleRawData(error,bytes_transferred))
{
assert(0);
return;
}


boost::asio::async_read(
m_Socket,
boost::asio::buffer(m_buf,gTempBufLen),
transfer_at_least(8),
m_Strand.wrap(boost::bind(&InnerSession::handle_read,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)));
}


HandleRawData函数式将m_buf里的数据缓存到内存池,问题是这样子的,当网络负载很大的情况下 ,?在没有调用到?boost::asio::async_read的时候,有新数据到达,这样造成了新数据丢失


我把上面的代码改成这样


void InnerSession::handle_read( const boost::system::error_code& error, size_t bytes_transferred )
{
if (error || bytes_transferred == 0)
{
std::cout<<"handle_read Error ID"<<error.value()<<error.message()<<std::endl;
std::cout<<"bytes_transferred is "<<bytes_transferred<<std::endl;
return;
}


Sleep(10);
if(!HandleRawData(error,bytes_transferred))
{
assert(0);
return;
}


boost::asio::async_read(
m_Socket,
boost::asio::buffer(m_buf,gTempBufLen),
transfer_at_least(8),
m_Strand.wrap(boost::bind(&InnerSession::handle_read,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)));
}


加了Sleep函数,数据丢失很严重。请问大神这个怎么解决撒 ?谢谢了



加载中
0
newzai
newzai

居然知道了问题所在,就应该每次在事件到达的时候,尽量读取更多的数据保存到自己的队列中。

你期望底层的数据缓冲区多大呢> 8K,还是8M,网卡的缓冲大小已经是固定的了,如果上层不及时读取走。遇到UDP,自然就是丢包,遇到TCP,那么对方的发送就很慢了。。

你不可能做到又不及时读取数据,数据又不丢失,能做到的就是提高读取数据的线程的优先级。尽量快速的读取数据到应用层,避免数据丢失。。   

0
y
yeti3

gTempBufLen 是30K

static tcp::no_delay option(false);
m_Socket.set_option(option);

boost::asio::socket_base::receive_buffer_size receSize(1024*30*64);
m_Socket.set_option(receSize);
这是我对socket设置的参数

即使尽量快的取走网络数据,但是在网络负载很大的情况下(比如客户端for循环里不停往服务器发送数据,使用TCP异步的方式,或者本地机器负荷很大,依然可能存在数据丢失的现象是吧 ?

返回顶部
顶部