2017-10-20 33 views
1

J'ai une question générale sur l'utilisation de Asio async_read_until de boost. La documentation indique qu'il peut y avoir plus de données dans le tampon lorsque le gestionnaire est appelé. Est-il possible de contourner ce problème et d'empêcher la mémoire tampon de consommer des octets à partir du socket juste après que la condition de séquence a été trouvée?Boost asio async_read_until arrêter de lire sur condition assortie

Répondre

1

Q. est-il un moyen de contourner ce

Pas directement, en raison du trafic réseau ainsi que fonctionne (il est orienté paquet).

Bien sûr, vous pouvez obtenir des choses sur la limite de protocole si l'expéditeur l'assure activement, mais c'est inhabituel pour les protocoles de flux.

Q. et arrêter le tampon de consommer des octets à partir du droit de la douille après que la condition de séquence est adapté?

Non, mais vous pouvez arrêter de consommer le tampon. Ainsi, par exemple c'est un motif valable:

boost::asio::streambuf sb; 
auto bytes = boost::asio::read_until(socket, sb, "\r\n\r\n"); 

std::istream is(&sb); 
std::string line; 
while (getline(is, line) && !line.empty()) { 
    std::cout << "Received: '" << line << "'\n"; 
} 

// sb still contains un-consumed data, if any 

utiliser simplement le même streambuf pour toute lecture ultérieure et gèrera la « position de flux » pour vous.