QTcpSocket: Lesen und Schreiben

Ich weiß, dass einige ähnliche Fragen bereits gestellt wurden, aber die Antworten auf die gefundenen Fragen deckten sehr spezifische Probleme ab und ich habe es immer noch nicht herausgefunden.

In meinem Programm erstelle ich ein QObject (QPeer), das ein QTcpSocket verwendet, um über ein Netzwerk mit einem anderen solchen Objekt zu kommunizieren. QPeer hat einen Steckplatz, der ein QByteArray mit Daten akzeptiert (sendData(QByteArray)). Der gesamte Inhalt dieses Arrays wird als eine "Nachricht" betrachtet und in den Socket geschrieben. Ich möchte Folgendes tun: Jedes Mal, wenn eine Nachricht geschrieben wird, möchte ich, dass der empfangende QPeer sein Signal sendetdataReceived(QByteArray) genau einmal, dass QByteArray die gesamte Nachricht enthält. (HINWEIS: Alle Signale / Slots, sowohl private, die den QPeer mit seiner Buchse verbinden, als auch öffentliche wie zsendData(QByteArray) werden mit serialisiertQt::QueuedConnection wann immer nötig.)

Ich benutze das SignalQTcpSocket::readyRead() zum asynchronen Lesen aus dem Socket. Jetzt weiß ich, dass ich nicht einfach anrufen kannQTcpSocket::write() einmal in sendData und dann davon ausgehen, dass der QTcpSocket auf der anderen Seite für jeden Schreibvorgang genau ein readyRead-Signal erzeugt. Also was soll ich tun?

Dies ist meine Idee, bitte sag mir, ob dies funktionieren wird:

SCHREIBEN:

void QPeer::sendData(QByteArray data)
{
    // TODO: write data.size() as raw int of exactly 4 bytes to socket
    const char *bytes = data.constData();
    int bytesWritten = 0;
    while (bytesWritten < data.size())
        bytesWritten += _socket->write(bytes + bytesWritten);
}

LESEN:

jetzt möchte ich die lesefunktion (verbunden mitQTcpSocket::readyRead()), um den Header zu verwenden (das 4-Byte-Int, das die Länge der Nachricht angibt) und dann die Anzahl der Bytes zu lesen; next emit dataMit genau diesen Bytes empfangen. Ich habe ernsthafte Probleme damit.Zum Beispiel: Was ist zu tun, wenn readyRead ausgegeben wird und ich den Header einer Nachricht lesen kann, aber nicht die angegebene Anzahl von Bytes? Oder was ist, wenn ein Header nur teilweise empfangen wurde?

1. Wie schreibe ich den Header (4 Byte Int) richtig in den Socket?

2. Wie implementiere ich die Lesefunktion richtig, damit sie das tut, was ich will?

Irgendwelche Tipps sind willkommen. Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage