boost :: asio :: streambuf :: consume - Inyecta carácter basura

Cuando pierdo la conexión, en el código de mi servidor, trato de volver a conectarme en un bucle para siempre. Una vez que me vuelvo a conectar, envío un mensaje de inicio de sesión al componente al que estoy conectado. Ese componente luego envía una respuesta de inicio de sesión que se parece a "MyResponse"

La conexión inicial funciona bien. Sin embargo, después de volver a conectarme, recibo basura antes del mensaje esperado, que se ve así: "ýMyResponse"

Después de googlear esto. Veo muchas preguntas en Stack Overflow sobre el boost :: asio :: streambuf que se usa para sockets asíncronos en boost :: asio. Particularmente sobre la reutilización del tampón. Seguí el consejo allí y llamé a consumir al desconectarme. En otras palabras, llamo boost :: asio :: streambuf :: consume después de llamar al apagado y cerrar en mi zócalo, después de ser llamado de nuevo con un error en recv en respuesta a una llamada a recv_until.

También he usado wireshark para asegurarme de que el carácter de basura no se envía y no se envía.

Después de mucha depuración, parece que las llamadas a consumir están inyectando un carácter en lugar de borrar todos los caracteres.

Aquí hay un ejemplo mínimo:

#include <boost/asio.hpp>

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    boost::asio::streambuf buffer;

    std::cout << "buffer size " << buffer.size() << std::endl;

    buffer.consume(std::numeric_limits<size_t>::max());

    std::cout << "buffer size " << buffer.size() << std::endl;

    std::istream is(&buffer);
    std::string contents;
    is >> contents;

    std::cout << "Contents: "  << contents << std::endl;

    std::cout << "buffer size " << buffer.size() << std::endl;

    return 0;
}

Salida:

buffer size 0
buffer size 1
Contents: ²
buffer size 0

Rendimiento esperado:

buffer size 0
buffer size 0
Contents:
buffer size 0

Si no uso Consumo, recibo parte del mensaje, antes de desconectar, antes del primer mensaje después de la reconexión, en el código de mi servidor.

Si uso consume, obtengo un carácter basura.

Ver:

Trabajando con boost :: asio :: streambuf

Leer hasta un delimitador de cadena en boost :: asio :: streambuf

impulsar asio async_read: el mensaje leído se agrega a sí mismo

Respuestas a la pregunta(2)

Su respuesta a la pregunta