Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Fr 14.08.09 17:58 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 14.08.09 18:28 
Schau dir die Komponente mal 20 Sekunden lang im Objektinspektor an.. vielleicht fällt dir da was ins Auge..

_________________
PROGRAMMER: A device for converting coffee into software.
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Fr 14.08.09 18:37 
ReadTimeout=-1
das sollte bedeuten: kein timeout

ok erster teil geklärt
und der 2. teil?
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 14.08.09 20: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.

_________________
PROGRAMMER: A device for converting coffee into software.
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Sa 15.08.09 02: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)