2017-06-07 5 views
1

J'essaye de recevoir un paquet via http dans mon programme C++. J'utilise Boost.Asio à cette fin.Will Boost.Async_read_some le message entier?

Dans mon méthode handleAccept Je possède ce code pour lire le paquet:

// m_buffer is declared as: std::array<char, 8192> m_buffer; 
    auto buf = boost::asio::buffer(m_buffer); 
    newConnection->getSocket().async_read_some(
     buf, 
     boost::bind(&TcpServer::handleRead, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred) 
    ); 

Est-ce assez pour obtenir un paquet? Comment est-ce que je m'assure qu'il obtiendra des paquets qui sont plus grands que 8192 octets?

Répondre

1

async_read_some lit un message reçu jusqu'à la taille du tampon que vous lui donnez. Le nombre d'octets dans un message reçu est renvoyé dans l'espace réservé bytes_transferred de la fonction de rappel, voir basic_stream_socket::async_read_some

Si vous connaissez la taille maximale des messages que vous souhaitez recevoir, vous pouvez simplement utiliser un tampon suffisamment grand pour ce message. Sinon, vous devrez copier le contenu du tampon async_read_some ailleurs et créer le message reçu dans son intégralité.

+0

OK, cela a du sens. Donc le chemin à parcourir est d'appeler handleRead récursivement jusqu'à ce que le paramètre 'bytesTransferred' de _handleRead_ soit 0? – Ctwx

+1

Non, vous ne recevrez jamais 'bytes_transferred' == 0. Votre protocole de message devrait vous indiquer la taille du corps du message au début d'un message ou déconnecter le socket une fois terminé. Dans le second cas, vous devrez vérifier l'espace réservé 'error'. – kenba

+0

OK merci. Ça va marcher. – Ctwx