Ich rufe async_read auf einem Domain-Socket und mein Problem ist, dass ich manchmal Daten bekomme und manchmal nicht, obwohl das entfernte System immer Daten zurückgibt. Ich scheine in der Lage zu sein, von der Steckdose zu lesen, wenn ich Schritt-für-Schritt-Debugging mache. Wenn ich Komponententests automatisiere, scheinen sie zu schnell zu laufen, um Daten zurückzugeben, was merkwürdig ist, da der ganze Zweck von asynchronen Methoden darin besteht, auf eine Antwort zu warten.Heisenbug bei einem anyrronous lesen von Socket
ich diese als Eigenschaften meiner Klasse haben:
io_service run_loop;
stream_protocol::socket connection_socket;
datagram_protocol::endpoint domain_socket_ep;
vector<unsigned char>read_buffer;
ich einen Schreib:
void operator>>(const vector<unsigned char> input, shared_ptr<Socket>socket) {
asio::async_write(socket->connection_socket, asio::buffer(input), std::bind(&Socket::write_handler, socket, std::placeholders::_1, std::placeholders::_2));
socket->run_loop.reset();
socket->run_loop.run();
}
Im Schreib Rückruf ich eine Lese:
void Socket::write_handler(const std::error_code &ec, const size_t size) noexcept {
const size_t avail = connection_socket.available();
if (!read_buffer.empty()) {
read_buffer.clear();
}
asio::async_read(connection_socket, asio::buffer(read_buffer, avail), std::bind(&Socket::read_handler, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}
Ich habe versucht, Wrapping der Lesefunktion in einem while(read_buffer.size() < avail)
, aber das warf mich gerade in eine Endlosschleife.
Ich vermisse definitiv etwas hier, ich kann einfach nicht herausfinden, was und die Tatsache, dass das funktioniert, wenn man unter Schritt für Schritt läuft, macht es nur noch schlimmer.
Was die zugewiesene Größe für ‚Input‘ und read_buffer? – Arunmu
Die Eingabe wird vom Benutzer gesendet und ist in meinen Tests nie leer. read_buffer wird auf die Anzahl der Bytes im Socket gesetzt. – ruipacheco