Używam Boost.Asio do operacji sieciowych, muszą (i faktycznie, nie ma złożonych struktur danych ani nic) pozostać dość niskim poziomem, ponieważ nie stać mnie na luksus związany z serializacją (a biblioteki, które znalazłem, które dawały wystarczająco dobre wyniki, wydawały się źle dopasowane do mojego przypadku).Funkcja wywołania zwrotnego Asio nie jest wywoływana
Problem polega na tym, że piszę asynchronicznie robię od klienta (w QT, ale to prawdopodobnie powinno być tutaj nieistotne). Wywołanie zwrotne określone w async_write
nie jest wywoływane, nigdy, i mam całkowitą stratę, dlaczego. Kod to:
void SpikingMatrixClient::addMatrix() {
std::cout << "entered add matrix" << std::endl;
int action = protocol::Actions::AddMatrix;
int matrixSize = this->ui->editNetworkSize->text().toInt();
std::ostream out(&buf);
out.write(reinterpret_cast<const char*>(&action), sizeof(action));
out.write(reinterpret_cast<const char*>(&matrixSize), sizeof(matrixSize));
boost::asio::async_write(*connection.socket(), buf.data(),
boost::bind(&SpikingMatrixClient::onAddMatrix, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
, który wywołuje pierwszy zapis. Wywołanie zwrotne to
void SpikingMatrixClient::onAddMatrix(const boost::system::error_code& error, size_t bytes_transferred) {
std::cout << "entered onAddMatrix" << std::endl;
if (!error) {
buf.consume(bytes_transferred);
requestMatrixList();
} else {
QString message = QString::fromStdString(error.message());
this->ui->statusBar->showMessage(message, 15000);
}
}
Oddzwonienie nigdy nie jest wywoływane, mimo że serwer odbiera wszystkie dane. Czy ktokolwiek może pomyśleć o jakimkolwiek powodzie, dlaczego to robił?
P.S. Było opakowanie dla tego połączenia i tak, prawdopodobnie znowu będzie. Porzuciłem go dzień lub dwa temu, ponieważ nie mogłem znaleźć problemu z tym oddzwanianiem.
Prawdopodobnie głupie pytanie, ale na wszelki wypadek ... Nazywasz "uruchom" na io_server, aby wysłać wywołania zwrotne? – jcoder
Uzgodnione. Wygląda na to, że kod nie został napisany. Musi zobaczyć więcej do zdiagnozowania. – Chad
@JohnB wcale nie głupie pytanie. Jak zauważył @Chad, nie ma nic złego w opublikowanym ograniczonym fragmencie kodu. @ TC1 Proponuję gotowanie tego problemu do odtwarzalnego przykładu, uzupełnionego o 'main' i' io_service.run() 'gdzieś. –