Entwickler-Ecke

Internet / Netzwerk - Indy ReadBytes beenden/fehlgeschlagen


Flamefire - Fr 14.08.09 18:58
Titel: Indy ReadBytes beenden/fehlgeschlagen
2 Fragen zu dem IndyClient:
Ich Bekomme Pakete mit einer Größe am Anfang und dem Inhalt
Also habe ich einen Thread, mit dem ich "While(not Terminated) do Empfange"
die Pakete empfange
Das ganze arbeitet mit blocking sockets

1. Frage: Gibt es ein Timeout beim Lesen? Wie kann ich das behandlen?
z.zt. Habe ich das so:

Delphi-Quelltext
1:
2:
3:
4:
  size:=Word(Client.Socket.ReadSmallInt(false));
  SetLength(Buffer,2);
  PWord(@Buffer[0])^:=size;
  Client.Socket.ReadBytes(Buffer,bfSize);

Habe aber Angst, dass ich Fehler bekomme bei
a) readSize bekommt nen timeout-->seltsamer wert in size-->rest des packets stimmt schon mal gar nicht
b) readpacket bekommt nen timeout-->parsing im anschluss wird mist, und nächste packete kann ich allesamt vergessen

2. Frage: Wie mache ich das beim Beenden?
ich will ja den Thread auch beenden können oder den Client neu verbinden.
Dazu muss ich ja irgendwie auch das ReadBytes, dass grade auf Daten wartet, abbrechen, und von anfang an neustarten
wie geht das?


Xentar - Fr 14.08.09 19:28

Schau dir die Komponente mal 20 Sekunden lang im Objektinspektor an.. vielleicht fällt dir da was ins Auge..


Flamefire - Fr 14.08.09 19:37

ReadTimeout=-1
das sollte bedeuten: kein timeout

ok erster teil geklärt
und der 2. teil?


Xentar - Fr 14.08.09 21:24

a) gilt hier immernoch "eine Frage pro Thread"
und b) hat sich das damit doch auch schon geklärt..? ReadBytes kannst du nicht abbrechen - aber es reicht doch, wenn du den Timeout klein genug setzt.. Verwende in meinen Anwendungen auch nur Timeouts von 10ms oder so. Wenn Daten da sind, werden die trotzdem komplett abgeholt. Wenn keine da sind, na und, ist ja ein Thread, läuft der halt nochmal durch. Um den Thread dann zu beenden mit Terminate abbrechen, und mit WaitFor warten, bis der Timeout abgelaufen, und der thread fertig ist.


Flamefire - Sa 15.08.09 03:09

zwecks a) ich fand dass die 2 fragen sich aufeinander beziehen
darum habe ich sie zusammengestellt
will ja nicht unnötig unordnung verursachen

das problem bei meiner anwendung ist ja, wenn ich timeouts setze könnte ich unvollständige daten bekommen, was fatal wäre
und ich will ja nicht den thread beenden, sonder einfach nur das readbytes abbrechen (oder besser den execute teil des threads) um mich auf einen andren server zu verbinden (im speziellen fall habe ich einen login server und einen main server)