Ja. Ich weiß, dass es um diese time_out
in boost::asio
einige Fragen gab. Mein Problem könnte zu einfach für die asio
Jungs hier lösen.boost: asio :: lesen oder boosten: asio :: async_read mit timeout
Ich verwende boost::asio
auf TCP-Protokoll, um Daten über ein Netzwerk kontinuierlich in einer Schleife so schnell wie möglich zu lesen.
Folgende Funktion ReadData()
wird kontinuierlich von einem Arbeiter std::thread
in einer While-Schleife aufgerufen.
std::size_t ReadData(std::vector<unsigned char> & buffer, unsigned int size_to_read) {
boost::system::error_code error_code;
buffer.resize(size_to_read);
// Receive body
std::size_t bytes_read = boost::asio::read(*m_socket, boost::asio::buffer(buffer), error_code);
if (bytes_read == 0) {
// log error
return;
}
return bytes_read;
}
Es funktioniert gut. Gibt die Daten zurück. Alles ist gut.
All Ich möchte, ist zu eine für die boost::asio::read
time_out verwenden. Ich habe gelernt, dass ich boost::asio::async_read
mit boost::asio::async_wait
für die time_out-Technik verwenden muss, um zu arbeiten.
Eine boost example schlägt vor, boost::asio::async_read_until
zu verwenden?
Sollte ich boost::asio::async_read
oder boost::asio::async_read_until
verwenden?
Es spielt keine Rolle, ob ich boost::asio::async_read
oder boost::asio::async_read_until
oder boost::asio::read
verwende. Aber ich möchte den asio::read
Anruf ausgelöst werden & innerhalb des Aufrufs an meine Methode ReadData
getan, so dass der Client-Code nicht betroffen wird.
Wie kann ich das erreichen? Bitte legen nahe,
Sie wissen, dass Sie verwenden können, 'Buchse :: abbrechen() 'um eine asynchrone Operation abzubrechen, richtig? –
ja. Ich weiß, dass ich den Socket abbrechen sollte, wenn das time_out erreicht ist. Aber wie verwende ich ein time_out in der Async-Lese an erster Stelle? –
@TheQuantumPhysiker. Funktioniert 'socket :: cancel()' bei einer synchronen Leseoperation? –