void Connection::HandleRecvData(const boost::system::error_code & error)
{
boost::asio::async_read( m_socket, boost::asio::buffer( m_recv_buffer ),
m_io_strand.wrap( boost::bind( &Connection::HandleRecvData,
shared_from_this(), _1, _2 ) ) ); //works
boost::asio::async_read( m_socket, boost::asio::buffer( inbound_data_ ),
m_io_strand.wrap( boost::bind( &Connection::HandleRecv,
shared_from_this(), _1, _2 ) ) ); //doesn't work
}
Обработчик
void Connection::HandleRecv( const boost::system::error_code & error, int32_t actual_bytes )
{
if( error || HasError() || m_hive->HasStopped() )
{
StartError( error );
}
else
{
m_recv_buffer.resize( actual_bytes );
OnRecv( m_recv_buffer );
m_pending_recvs.pop_front();
if( !m_pending_recvs.empty() )
{
StartRecv( m_pending_recvs.front() );
}
}
}
Различные типы буферов:
std::vector< uint8_t > m_recv_buffer; //and
std::vector< char > m_recv_buffer;
Я не получаю сообщение об ошибке компилятора, но во время выполнения, когда цепочка событий для получения данных запускается, "& Connection :: HandleRecv" никогда не вызывается. Я предполагаю, что это потому, что сигнатура функции неверна, когда заполнители оцениваются и функция никогда не вызывается.
Может кто-нибудь помочь объяснить, как заполнители оцениваются / подчиняются.
Я проверил документацию по привязке и вижу:
bind(&X::f, ref(x), _1)(i); // x.f(i)
bind(&X::f, &x, _1)(i); //(&x)->f(i)
bind(&X::f, x, _1)(i); // (internal copy of x).f(i)
bind(&X::f, p, _1)(i); // (internal copy of p)->f(i)
но нет "(i)", когда я звоню.
boost::bind( &Connection::HandleRecvData, shared_from_this(), _1, _2 )
PS Это мой первый пост, любые советы могут быть полезны в том, что касается уровня детализации, который я предоставил, и где я могу более четко описать свою проблему в следующий раз. Заранее спасибо.