Cómo determinar correctamente que el final de la entrada se ha alcanzado en un QTCPSocket?

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

  •  26-09-2019
  •  | 
  •  

Pregunta

Tengo el siguiente código que se lee de un QTCPSocket:

QString request;

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

El problema con este código es que se lee toda la entrada y luego hace una pausa en el extremo durante 30 segundos. (Que es el tiempo de espera predeterminado.)

¿Cuál es la forma correcta para evitar el largo tiempo de espera y detectar que el final de la entrada se ha alcanzado? (Una respuesta que señales Evita se prefiere debido a que se supone que estar sucediendo de forma sincrónica en un hilo.)

¿Fue útil?

Solución

La única manera de estar seguro es cuando se ha recibido el número exacto de bytes que usted está esperando. Esto se realiza comúnmente mediante el envío del tamaño de los datos al principio del paquete de datos. Leer la primera y luego seguirá sonando hasta que lo consigue todo. Una alternativa es utilizar un centinela, una serie específica de bytes que marcan el final de los datos, pero esto generalmente se complica.

Otros consejos

Si usted está tratando con una situación como una respuesta HTTP que no contiene un Content-Length, y conoce el otro extremo se cerrará la conexión una vez que se envían los datos, existe una solución alternativa.

  1. Uso socket.setReadBufferSize para asegurarse de que hay suficiente búfer de lectura para todos los datos que pueden ser enviadas.
  2. Llamada socket.waitForDisconnected a esperar a que el extremo remoto para cerrar la conexión
  3. Uso socket.bytesAvailable como la longitud del contenido

Esto funciona porque el cierre de la conexión no se descarta ningún datos almacenados temporalmente en un QTcpSocket.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top