Ho un server che riceve una stringa compressa (compresso con zlib) da un client e stavo usando async_receive
dalla libreria boost::asio
per ricevere questa stringa, risulta comunque che non è garantito che tutti i byte saranno ricevuti, quindi ora devo cambiarlo in async_read
. Il problema che devo affrontare è che la dimensione dei byte ricevuti è variabile, quindi non sono sicuro di come usare async_read
senza conoscere il numero di byte da ricevere. Con il async_receive
ho solo un boost::array<char, 1024>
, tuttavia questo è un buffer che non è necessariamente riempito completamente.boost :: asio async_read garantisce che tutti i byte siano letti
Mi chiedevo se qualcuno può suggerire una soluzione in cui posso usare async_read anche se non conosco il numero di byte da ricevere in anticipo?
void tcp_connection::start(boost::shared_ptr<ResolverQueueHandler> queue_handler)
{
if (!_queue_handler.get())
_queue_handler = queue_handler;
std::fill(buff.begin(), buff.end(), 0);
//socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error));
boost::asio::async_read(socket_, boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error));
}
buff
è un boost::array<char, 1024>
+1 bel riassunto di alcune soluzioni possibili –