Comportamento di QTcpSocket :: waitForBytesWritten?
-
09-10-2019 - |
Domanda
Sono un po 'confuso sul comportamento dei QTcpSocket::waitForBytesWritten()
. ..
Fino a quando fa questo blocco funzionale?
- Fino a quando i dati vengono scritti al buffer interno del sistema operativo per la trasmissione su TCP?
- Fino a quando i dati sono fisicamente convertiti in pacchetti TCP e inviato?
- Fino a quando l'intero dati vengono trasmessi e il client remoto riconosce che tutti i pacchetti sono stati ricevuti?
Ho guardato la documentazione, ma non sembra essere molto chiaro.
Soluzione
In generale i sistemi operativi forniscono solo semplici API per la prima domanda - dal momento che Qt è un'API portatile, è meglio solo a fare affidamento su di essa si riferisce al trasferimento al buffer del sistema operativo. Se avete bisogno di un riconoscimento effettivo di ricevimento, è meglio averlo inviato dall'applicativo remoto -. Dopo tutto, i dati possono essere ack'd dalla distanza ma mai leggere il sistema operativo del telecomando lettura del buffer
Se è necessario per evitare che il blocco lato remoto per sempre, si deve invece attendere il QIODevice::bytesWritten
del segnale e ritorno al ciclo di eventi di fare altro lavoro, o semplicemente impostare un timeout appropriato. In generale, il lato remoto può sempre bloccare a un certo livello - vale a dire, si può rifiutare di ack, riempire il buffer del sistema operativo locale, presso il quale scrive punto non ce la farà da Qt per il sistema operativo; non importa quale livello waitForBytesWritten()
è, può sempre essere bloccata.
In quanto tale, bytesWritten
e waitForBytesWritten()
deve essere utilizzato solo per valvola a farfalla l'origine dei dati - vale a dire, se si dovesse entrare in un ciclo stretto passaggio 1G dei dati alla presa tutto in una volta, si potrebbe finire il buffering in il processo e esaurimento della memoria. Innescando ulteriore legge / scrive con il segnale bytesWritten
, è possibile evitare questo problema.