J'ai un serveur qui reçoit une chaîne compressée (compressée avec zlib) d'un client, et j'utilisais async_receive
de la bibliothèque boost::asio
pour recevoir cette chaîne, il s'avère cependant que il n'y a aucune garantie que tous les octets seront reçus, donc je dois maintenant le changer en async_read
. Le problème auquel je suis confronté est que la taille des octets reçus est variable, donc je ne suis pas sûr de savoir comment utiliser async_read
sans connaître le nombre d'octets à recevoir. Avec le async_receive
j'ai juste un boost::array<char, 1024>
, cependant c'est un tampon qui n'est pas nécessairement complètement rempli.boost :: asio async_read garantir que tous les octets sont lus
Je me demandais si quelqu'un pouvait proposer une solution où je pourrais utiliser async_read même si je ne connais pas le nombre d'octets à recevoir à l'avance?
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
est un boost::array<char, 1024>
+ 1 bon résumé de quelques solutions possibles –