2011-01-11 10 views
10

Ich bin ein wenig verwirrt über das Verhalten von QTcpSocket::waitForBytesWritten() ...Verhalten von QTcpSocket :: waitForBytesWritten?

Bis wann blockiert diese Funktion?

  • Bis die Daten in den internen Puffer des Betriebssystems zur Übertragung über TCP geschrieben werden?
  • Bis die Daten physisch in TCP-Pakete konvertiert und gesendet werden?
  • Bis die gesamten Daten übertragen werden und der Remote-Client bestätigt, dass alle Pakete empfangen wurden?

Ich schaute auf die Dokumentation, aber es schien nicht sehr klar zu sein.

Antwort

7

Im Allgemeinen bieten Betriebssysteme nur einfache APIs für die erste Frage - da Qt eine portable API ist, ist es am besten, sich nur auf die Übertragung in den Puffer des Betriebssystems zu verlassen. Wenn Sie eine tatsächliche Empfangsbestätigung benötigen, ist es am besten, sie von der Remote-Anwendung senden zu lassen - schließlich können Daten von der Remote-Station gelesen werden, aber niemals den OS-Lese-Puffer des Remote gelesen werden.

Wenn Sie vermeiden müssen, dass die Remote-Seite Sie für immer blockiert, sollten Sie stattdessen auf das Signal QIODevice::bytesWritten warten und zur Ereignisschleife zurückkehren, um andere Arbeiten auszuführen, oder einfach ein entsprechendes Timeout festlegen. Im Allgemeinen kann die entfernte Seite Sie immer auf einer bestimmten Ebene blockieren - dh, sie kann es ablehnen zu quitschen, Ihren lokalen OS-Puffer aufzufüllen, zu welchem ​​Zeitpunkt Schreibvorgänge es nicht von Qt zum Betriebssystem machen; Egal welches Level waitForBytesWritten() ist, es kann immer blockiert werden.

bytesWritten und waitForBytesWritten() sollten nur verwendet werden, um die Quelle der Daten zu drosseln - dh wenn Sie in eine enge Schleife gehen würden, die 1G Daten auf einmal an den Socket weitergibt, könnte es zu einer Pufferung führen in dem Prozess und nicht genügend Speicher. Durch Auslösen zusätzlicher Lese-/Schreibvorgänge mit dem Signal bytesWritten können Sie dieses Problem vermeiden.

+0

Ich brauche keine Empfangsbestätigung. Was ich wirklich möchte, ist die Situation zu vermeiden, in der ein Client die Anwendung verzögern kann, indem er darauf wartet, die ACK zu senden. –

+1

@George: Antwort aktualisiert :) – bdonlan