Frage

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

Bis wann ist das Funktionsbaustein?

  • Bis die Daten an das Betriebssystem des internen Puffer für die Übertragung über TCP geschrieben?
  • Bis die Daten physikalisch auf TCP-Pakete umgewandelt und gesendet?
  • , bis die gesamten Daten übertragen werden und der Remote-Client erkennt an, dass alle Pakete empfangen worden ist?

schaute ich auf die Dokumentation, aber es schien nicht ganz klar zu sein.

War es hilfreich?

Lösung

Im Allgemeinen OSes bieten nur einfache APIs für die erste Frage - da Qt ein portables API ist, ist es nur am besten, sich auf sie zu den OS-Puffer auf die Übertragung bezieht. Wenn Sie eine tatsächliche Empfangsbestätigung benötigen, ist es am besten, um es von der Remote-Anwendung gesendet -. Schließlich können Daten von den entfernten ack'd werden aber nie die Fernbedienung des O Lesepuffer abgelesen

Wenn Sie Sie die Remote-Seite Block für immer vermeiden müssen, sollten Sie stattdessen warten, bis die QIODevice::bytesWritten Signal und Rückkehr zu der Ereignisschleife andere Arbeit zu tun ist, oder einfach eine entsprechende Timeout. Im Allgemeinen kann die Remote-Seite auf einer gewissen Ebene blockieren Sie immer - das heißt, es kann sich weigern, Ihren lokalen OS-Puffer ack, Auffüllen, an welcher Stelle schreibt er nicht von Qt auf die OS machen; Egal auf welcher Ebene waitForBytesWritten() ist, kann es immer blockiert werden.

Als solche bytesWritten und waitForBytesWritten() sollte nur auf Gas die der Datenquelle verwendet werden - das heißt, wenn Sie in einer engen Schleife gehen waren 1G von Daten an die Steckdose vorbei, wenn alle an, Sie könnten Pufferung landen sie in das Verfahren und läuft aus dem Speicher. Durch das Auslösen weiterer liest / schreibt mit dem bytesWritten Signal, können Sie dieses Problem vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top