Wie man richtig feststellen, dass die End-of-Eingang wird in einem QTcpSocket erreicht?

StackOverflow https://stackoverflow.com/questions/4029802

  •  26-09-2019
  •  | 
  •  

Frage

Ich habe den folgenden Code, der von einem QTcpSocket lautet:

QString request;

while(pSocket->waitForReadyRead())
{
    request.append(pSocket->readAll());
}

Das Problem mit diesem Code ist, dass es all Eingänge liest und hält dann am Ende für 30 Sekunden. (Was ist das Standard-Timeout).

Was ist der richtige Weg, um die lange Timeout zu vermeiden und erkennen, dass das Ende des Eingangs erreicht? (Eine Antwort, dass vermeiden Signale bevorzugt, weil dies angeblich geschah in einem Thread synchron werden.)

War es hilfreich?

Lösung

Der einzige Weg, um sicher zu sein, wenn Sie die genaue Anzahl der empfangenen Bytes haben Sie erwarten. Dies wird im Allgemeinen durch das Senden der Größe der Daten am Anfang des Datenpaketes durchgeführt. Lesen Sie die erste und dann halten Looping, bis Sie alles bekommen. Eine Alternative ist ein Sentinel, eine bestimmte Reihe von Bytes zu verwenden, das das Ende der Daten markieren, aber dies in der Regel wird chaotisch.

Andere Tipps

Wenn Sie es zu tun mit einer Situation wie eine HTTP-Antwort, die keine Content-Length enthält, und Sie wissen, das andere Ende der Verbindung wird geschlossen, sobald die Daten gesendet werden, gibt es eine alternative Lösung.

  1. Verwenden Sie socket.setReadBufferSize um sicherzustellen, dass es genug Lesepuffer für alle Daten, die gesendet werden können.
  2. Anruf socket.waitForDisconnected für das Remote-Ende warten, um die Verbindung
  3. schließen
  4. Verwenden Sie socket.bytesAvailable als Inhaltslänge

Das funktioniert, weil ein Ende der Verbindung verwirft keine gepufferten Daten in einem QTcpSocket.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top