2011-01-11 10 views
10

Estoy un poco confundido sobre el comportamiento de QTcpSocket::waitForBytesWritten() ...Comportamiento de QTcpSocket :: waitForBytesWritten?

¿Hasta cuándo se bloquea esta 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 conviertan físicamente en paquetes TCP y se envíen?
  • ¿Hasta que se transmitan todos los datos y el cliente remoto reconoce que se han recibido todos los paquetes?

Miré la documentación, pero no parecía muy clara.

Respuesta

7

En general, los sistemas operativos solo proporcionan API fáciles para la primera pregunta, ya que Qt es una API portátil, lo mejor es confiar únicamente en la transferencia al búfer del SO. Si necesita un acuse de recibo real, es mejor que lo envíe la aplicación remota; después de todo, los datos pueden ser capturados por el control remoto, pero nunca leen el búfer de lectura del sistema operativo remoto.

Si necesita evitar que el control remoto le bloquee para siempre, en su lugar debe esperar la señal QIODevice::bytesWritten y volver al bucle de eventos para realizar otro trabajo, o simplemente establecer un tiempo de espera adecuado. En general, el lado remoto siempre puede bloquearlo en algún nivel, es decir, puede negarse a responder, llenando su búfer de sistema operativo local, en cuyo momento las escrituras no pasarán de Qt al sistema operativo; no importa en qué nivel esté waitForBytesWritten(), siempre se puede bloquear.

Como tal, bytesWritten y waitForBytesWritten() sólo se debería 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 se en el proceso y quedando sin memoria. Al activar lecturas/escrituras adicionales con la señal bytesWritten, puede evitar este problema.

+0

No necesito acuse de recibo. Lo que * realmente * quiero es evitar la situación en la que un cliente puede retrasar la aplicación esperando a enviar el ACK. –

+1

@George: respuesta actualizada :) – bdonlan