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.
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. –
@George: Antwort aktualisiert :) – bdonlan