[Megoldva] Qt, socket - üzenetek elakadása

Fórumok

Sziasztok!

A következő problémával szembesültem, amire nem sikerült megoldást találnom:

Van egy Qt-s szerveren és egy kliensem, melyek socketen keresztül kommunikálnak. Vannak olyan esetek, amikor a szerver egymás után több üzenetet küld egy kliensnek, tehát többször hívódik meg a QTcpSocket write metódusa. Ekkor csak az első üzenet jut el a klienshez. A waitForBytesWritten és a flush nem segített. A buffer kiürül, a write minden üzenet esetén annyival tér vissza, ahány byte az üzenet hossza, tehát elvileg elküldi, de a klienshez csak az első érkezik meg. Ami még érdekes: ha a kliens egy újabb kérést küld a szervernek, akkor a megfelelő válasz helyett az előzőleg elmaradt üzenetet fogadja a kliens, és az újabb üzenet várakozik valahol, és így tovább.

Találkozott már valaki hasonló problémával? Ha a QTcpSocket szerint üres a buffer, akkor hol tárolódhatnak még az elakadt üzenetek?

Kódrészlet:

Sever osztályban:

client->send("UZENET 1");
client->send("UZENET 2");

A send metódus:

void ClientThread::send(QString str)
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_3);
out << (quint16)0;
out << str;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));

tcpSocket->write(block);
tcpSocket->waitForBytesWritten(-1);
}

Előre is köszönök minden választ!

Hozzászólások

tcpSocket->waitForBytesWritten(-1); - ez mit terit vissza?

Mutasd a kliens kodot!

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

A waitForBytesWritten minden esetben true-val tér vissza.

A Client konstruktorában:

connect(this, SIGNAL(readyRead()), this, SLOT(recv()));

A recv:

void Client::recv()
{
QDataStream in(this);
in.setVersion(QDataStream::Qt_4_0);

if (blockSize == 0)
{
if (bytesAvailable() < (int)sizeof(quint16))
return;
in >> blockSize;
}

if (bytesAvailable() < blockSize)
return;

in >> msg;
blockSize = 0;

workUpMsg(msg);
}

A workUpMsg értelmezi a kapott üzenetet.

Nem ertek QT-hez, de szerintem beolvasaskor nem olvasod be a teljes uzenetet. En leellenoriznem azt a par return-ot a beolvasasakor (tobb return egy fuggvenyben kerulendo amugy!), es a kiiras a szerverben is gyanus!

Meg feldolgozni angolul process, es nem workUp! :^)

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

Igen, talalkoztam mar ilyennel. Vagy legalabbis hasonloval.
Bar en line-oriented protocols transfert hasznaltam a block-oriented helyett.

Mindenesetre ahogy eszrevettuk, anno egy Java-s szerver es egy Qt-s kliens kozott oly modon veszett el adat, hogy amikor a szerver 1-nel tobbszor kuldott uzenetet a kliensnek valaszra varas nelkul, akkor a kliensben a readyRead() egyszeruen csak 1x emittolodott, tobbszor nem.
A rapid megoldast egy oda-vissza (folyamatosan) kommunikalo protokoll jelentette. /Tehat mondjuk adott esetben egy egyszeru ack vagy pong. :) /

Köszönöm a segítségeteket!
Sikerült megtalálni a megoldást, valóban az volt a probléma, hogy a kliens nem minden kapott üzenetet olvasott be.