这是我服务器端收到数据后的回调函数 
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函数,数据丢失很严重。请问大神这个怎么解决撒 ?谢谢了 

解决方案 »

  1.   

    可以肯定不是你说的问题,而是strand的问题。
      

  2.   

    我试了下,将Strand去掉后,客户端for循环连续向服务器发送10000个包,服务器总是会丢失出现丢包 几十个左右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; 
    } std::cout<<"接受数据包的次数"<<++m_nCount<<std::endl;
    if(!HandleRawData(error,bytes_transferred)) 

    assert(0); 
    return; 
    } boost::asio::async_read( 
    m_Socket, 
    boost::asio::buffer(m_buf,gTempBufLen), 
    transfer_at_least(8), 
    boost::bind(&InnerSession::handle_read, 
    this, 
    boost::asio::placeholders::error, 
    boost::asio::placeholders::bytes_transferred)); 
    } 是不是m_buf中数据没及时拿走,下一次数据到来之后,m_buf内容又被后面的数据覆盖了?
      

  3.   

    难道在HandleRawData的时候,你没有把所有数据都拷走?
      

  4.   

    楼主可以尝试改为hp-socket,我的项目现在这个替代了 asio,真的不错。