Comment déterminer correctement que la fin de l'entrée a été atteint dans un QTcpSocket?

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

  •  26-09-2019
  •  | 
  •  

Question

Je le code suivant qui lit un QTcpSocket:

QString request;

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

Le problème avec ce code est qu'il lit tous l'entrée, puis fait une pause à la fin pendant 30 secondes. (Quel est le délai d'attente par défaut.)

Quelle est la bonne façon d'éviter le long délai d'attente et de détecter que la fin de l'entrée a été atteint? (Une réponse qui évite des signaux est préférable parce que cela est censé se produire de manière synchrone dans un thread.)

Était-ce utile?

La solution

La seule façon d'être sûr est quand vous avez reçu le nombre exact d'octets que vous attendez. Cela se fait couramment en envoyant la taille des données au début du paquet de données. Vous avez bien lu d'abord, puis en boucle jusqu'à ce que vous garder obtenez tout. Une alternative est d'utiliser une sentinelle, une série spécifique d'octets qui marquent la fin des données, mais cela devient généralement en désordre.

Autres conseils

Si vous avez affaire à une situation comme une réponse HTTP qui ne contient pas de Content-Length, et vous savez que l'autre extrémité fermera la connexion une fois que les données sont envoyées, il existe une solution alternative.

  1. Utilisez socket.setReadBufferSize pour vous assurer qu'il ya assez tampon de lecture pour toutes les données qui peuvent être envoyés.
  2. Appel socket.waitForDisconnected à attendre la fin à distance pour fermer la connexion
  3. Utilisez socket.bytesAvailable comme la longueur du contenu

Cela fonctionne parce que près de la connexion ne se défausse pas de données mises en mémoire tampon dans un QTcpSocket.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top