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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top