Cześć,
podczas uruchamiania klienta łącze się z serwerem i pobieram z niego pewne dane niezbędne do uruchomienia głównego programu.
Wysyłam do serwera jakiegoś stringa:
QByteArray byte_arr;
QDataStream bty(&byte_arr, QIODevice::WriteOnly);
bty.setVersion(QDataStream::Qt_5_5);
QString text = "Testowy string";
bty << qint32(0) << text;
bty.device()->seek(0);
bty << qint32(byte_arr.size() - sizeof(qint32));
this->socket->write(byte_arr);
Początkowo funkcja nie działała ponieważ klient nie czekała na odpowiedź serwera tylko wykonywał dalej swój kod.
Dodałem:
if(!this->socket->waitForReadyRead(-1))
{
return;
}
i generalnie pomogło, klient uruchamia readMessage() i odbiera poprawnie wiadomość.
Problem jednak pojawia się przy większych wiadomościach odbieranych z serwera, wydaje mi się, że metoda odbiera tylko pierwszą paczkę i nie czekając na kolejne wykonuje dalej kod klienta, tak wygląda odbiór:
readMessage()
{
QDataStream dat(this->socket);
dat.setVersion(QDataStream::Qt_5_5);
if(blockSize == 0)
{
if(this->socket->bytesAvailable() < sizeof(qint32))
return;
dat >> blockSize;
}
if(this->socket->bytesAvailable() != blockSize)
{
return;
}
qDebug() << " 1: " << this->socket->bytesAvailable();
qDebug() << " 2: " << blockSize;
dane >> dataType;
Jak zmusić funkcję aby czekała na całą wiadomość i dopiero jak dojdzie iść dalej z wykonywaniem reszty kodu?
Próbowałem dodać: socket->waitForBytesWritten(-1) ale nic nie pomogło :/