2011-01-11 11 views
10

Sono un po 'confuso sul comportamento di QTcpSocket::waitForBytesWritten() ...Comportamento di QTcpSocket :: waitForBytesWritten?

Fino a quando questa funzione si blocca?

  • Fino a quando i dati non vengono scritti nel buffer interno del sistema operativo per la trasmissione su TCP?
  • Fino a quando i dati non vengono fisicamente convertiti in pacchetti TCP e inviati?
  • Fino a quando non vengono trasmessi tutti i dati e il client remoto riconosce che tutti i pacchetti sono stati ricevuti?

Ho guardato la documentazione, ma non sembrava essere molto chiara.

risposta

7

In generale, i sistemi operativi forniscono solo API facili per la prima domanda: poiché Qt è un'API portatile, è meglio fare affidamento su di essa facendo riferimento al trasferimento nel buffer del sistema operativo. Se è necessaria una conferma di ricezione effettiva, è meglio farla inviare dall'applicazione remota - dopo tutto, i dati possono essere acquisiti dal telecomando ma non leggere mai il buffer di lettura del SO del telecomando.

Se è necessario evitare che il lato remoto blocchi per sempre, è necessario attendere il segnale QIODevice::bytesWritten e tornare al ciclo degli eventi per eseguire altre operazioni o semplicemente impostare un timeout appropriato. In generale, il lato remoto può sempre bloccarti ad un certo livello - cioè, può rifiutarsi di eseguire ack, riempiendo il tuo buffer OS locale, a quel punto le scritture non lo faranno da Qt al sistema operativo; indipendentemente dal livello waitForBytesWritten(), può sempre essere bloccato.

Come tale, bytesWritten e waitForBytesWritten() devono essere utilizzati solo per limitare la fonte dei dati, ad esempio, se si passasse in un ciclo stretto passando 1G di dati al socket tutti in una volta, si potrebbe finire con il buffering nel processo e esaurendo la memoria. Attivando ulteriori letture/scritture con il segnale bytesWritten, è possibile evitare questo problema.

+0

Non ho bisogno di ricevuta di ritorno. Quello che * voglio * veramente è evitare la situazione in cui un client può ritardare l'applicazione aspettando di inviare l'ACK. –

+1

@George: risposta aggiornata :) – bdonlan