Thema: Delphi ReadStream Timeout

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: ReadStream Timeout

  Alt 16. Jan 2007, 14:47
Hi,
das Empfangen eines Streams solltest Du bei den Indys als eine Aufgabe eines IO-Handlers sehen. Dieser kennt Methoden um das ganze (gepuffert) für dich zu übernehmen, ob der IOHandler Daten nun an einen Server oder Client weiterreicht ist erstmal egal. Du hast einfach eine Verbindung, einen Sender und einen Empfänger. Daten die vom Sender an den Empfänger geschickt werden nimmt einfach der IOHandler entgegen und schreibt die in einen Stream. Das wird solange gemacht, wie die Verbindung steht und die angegebene Anzahl von Bytes (die erwartet werden) noch nicht gelesen wurde.
Ist hier keine bestimmte Anzahl vorgegeben (-1), so wird erwartet, dass die Anzahl vor den Daten als Integer Wert verschickt wird (man kennt also in jedem Fall die Größe des übertragenen Datums!).

Vielleicht hat es deine Frage schon beantwortet, denn der Grund, dass die Indys hier nicht weiter auf mögliche Timeouts eingehen liegt darin, dass es keine Timeouts für diese Verbindung gibt. Der IOHandler kann auf eine beliebige Verbindung aufgesetzt werden (also jetzt rein theoretisch). Rein praktisch wirst Du ihn wohl zusammen mit dem TCP-Protokoll verwenden. Dieses ist verbindungsorientiert, eine Verbindung wird also aufrechterhalten (oder eben geschlossen). Tritt ein Fehler auf, so kann der sich nur im Schließen der Verbindung äußern und genau der Fall wird vom IOHandler behandelt.
Kommt aus einem bestimmten Grund kein Paket mehr an (TCP bekommt hierüber ja Bestätigungen), so wird einfach die Verbindung als geschlossen angesehen (und die Indy-Komponenten agieren so, als ob die Verbindung geschlossen wurde). Im unfreiwilligen Fall des Schließens bedeutet dies natürlich, dass ein entsprechendes Ereignis (ich denke es müßte ein Fehler sein) ausgelöst wird. Du kannst aber natürlich auch einfach die Verbindung explizit schließen. Beides würde der Empfänger mitbekommen und dem IOHandler mitteilen, der damit seine Arbeit einstellen kann.

Gruß Der Unwissende
  Mit Zitat antworten Zitat