Comportamiento de QTcpSocket :: waitForBytesWritten?
-
09-10-2019 - |
Pregunta
Estoy un poco confundido sobre el comportamiento de QTcpSocket::waitForBytesWritten()
. ..
Hasta cuando se hace este bloque de función?
- Hasta que los datos se escriben en el buffer interno del sistema operativo para la transmisión a través de TCP?
- Hasta que los datos se convierten físicamente a los paquetes TCP y envió?
- Hasta que todos los datos se transmiten y el cliente remoto reconoce que se han recibido todos los paquetes?
Me miró a la documentación, pero no parece ser muy clara.
Solución
sistemas operativos En términos generales sólo proporcionan APIs fáciles para la primera pregunta - desde Qt es una API portátil, lo mejor es sólo para confiar en ella se hace referencia a la transferencia de la memoria intermedia del sistema operativo. Si necesita un reconocimiento real de recepción, lo mejor es que le sea enviada por la aplicación remota -. Después de todo, los datos pueden ser ack'd mediante el mando a distancia, pero nunca leen en el sistema operativo del control remoto leer el búfer
Si tiene que evitar que el bloque de lado remoto para siempre, en su lugar debe esperar a que el QIODevice::bytesWritten
señal y vuelta al bucle de eventos para hacer otros trabajos, o simplemente establecer un tiempo de espera adecuado. En general, el lado remoto puede bloquear siempre que en algún nivel - es decir, puede negarse a ACK, llenar su memoria intermedia sistema operativo local, en la que las escrituras de punto no lo harán a partir de Qt para el sistema operativo; No importa qué nivel se encuentra en waitForBytesWritten()
, siempre se puede bloquear.
Como tal, bytesWritten
y waitForBytesWritten()
sólo se debe usar para estrangular la fuente de los datos - es decir, si usted fuera a entrar en un bucle estrecho que pasa 1G de datos para la toma de una sola vez, que podría terminar amortiguando en el proceso y salir corriendo de la memoria. Mediante la activación adicional lee / escribe con la señal bytesWritten
, puede evitar este problema.