Ich bin TCP-Server implementieren, die beide asio socket.async_read() und boost :: asio :: async_read_until() -Methoden zum asynchronen Lesen von Daten aus dem Socket verwendet. Beide verwenden denselben Handler zum Lesen von Daten aus boost :: asio :: streambuf.boost :: asio :: streambuf - Wie man Puffer wiederverwenden kann?
Der Handler, die perfekt funktioniert über async_read aufgerufen():
void handle_read(const boost::system::error_code& ec, std::size_t ytes_transferred))
{
m_request_buffer.commit(bytes_transferred);
boost::asio::streambuf::const_buffers_type rq_buf_data = m_request_buffer.data();
std::vector<uint8_t> dataBytes(boost::asio::buffers_begin(rq_buf_data), boost::asio::buffers_begin(rq_buf_data) + bytes_transferred);
//process data here
m_request_buffer.consume(bytes_transferred);
bytes_transferred = 0;
}
Mein Server auf die Verarbeitung von Daten kann Shutdown-Verbindung oder weiterhin über die gleiche Buchse Lesen abhängig.
Aber wenn Handle_read() von der 2. boost :: asi :: async_read_until() aufgerufen wird, bekomme ich eine Anzahl von Nullen in DataBytes und dann gültige Daten geht.
Ich versuchte einen einfachen Testfall und fand heraus, dass nach dem Schreiben von Daten in streambuf und commit() + consume() die Daten in streambuf noch den vorherigen Puffer behalten.
Also gibt es eine Möglichkeit, Daten in boost :: asio :: streambuf zu löschen und in boost :: asio :: async_read_until() wiederzuverwenden?
Wenn mit USE_STREAM kompiliert = 1, arbeitet das Live-Beispiel in Ordnung. Aber was std :: isorem unterscheidet sich im Vergleich zum Puffer verbrauchen()?
Danke für den Kommentar. Schließlich schaute ich auf boost :: asio :: async_read_until() Implementierung und fand heraus, dass es streambuf_.commit (bytes_transfered) ;. Also sollte ich commit() nicht in meinem Handler aufrufen.Aber im Fall der Verwendung von boost :: asio :: ip :: tcp :: socket.async_read() sollte mein Handler eine commit() aufrufen, um Zeichen von der Ausgabesequenz in die Eingabesequenz zu verschieben. – drus
@drus nein, du solltest nicht. Verwechsle dich nicht mit diesen Operationen. Alles, was ich jemals getan habe, war 'buffer.consume (puffer.size() + 1)' zu nennen, da dies garantiert den Puffer vollständig löscht. –
Ja, ich habe Boost :: asio :: async_read() und boost :: asio :: async_read_until() verwendet und es funktioniert wie erwartet. Wie ich schon sagte, rufen diese beiden Methoden streambuf.commit() auf. – drus