![]() |
Indy - Client lässt Server+andereClients abstürzen.
Hallo
Mein Problem sieht wie folgt aus. Ich habe einen Indy TCP/IP Server und zwei Clients. Die Kommunikatin und das steuern funktioniert auch ganz gut. ABER, wenn einer der beiden Clients abstürtzt oder einfriert, dann frieren der Server und der andere Client auch ein. Ich habe die IdTCPDemo mit Threads als Vorlage genommen. Indy Exceptions werden abgefangen. Gibt es eine Möglichkeit am Server einen Timeout einzustellen. Also wenn ein Client eine bestimmte Zeit nicht mehr reagiert, dann soll der thread geschlossen werde. In den Einstellungen finde ich dazu leider nichts. Delphi 7 Pro Indy 9 Windows XP Pro + SP1 tnxs greetz Corgan |
Re: Indy - Client lässt Server+andereClients abstürzen.
Wenn ein Client abschmiert, kann es sein, das er den Server mitnimmt. Zeig mal ein bisschen Code...
|
Re: Indy - Client lässt Server+andereClients abstürzen.
Eigentlich sollte es helfen, wenn Du dem Server die TIdAntiFreeze Komponente mitgibst und diese aktivierst.
...:cat:... |
Re: Indy - Client lässt Server+andereClients abstürzen.
Liste der Anhänge anzeigen (Anzahl: 2)
hallo
ich hänge mal die client und server.pas mit in den anhang. habe die aber gekürtzt, wegen der besseren übersicht. |
Re: Indy - Client lässt Server+andereClients abstürzen.
Zitat:
komisch ist ja auch, das nicht nur der server, sondern auch andere Clients mit "hängen" bleiben. wennn ich dann den abgestürtzten client beende, dann läuft sowohl der server, als auch die anderen clients weiter. |
Re: Indy - Client lässt Server+andereClients abstürzen.
die exception heist tidreadtimeout!
|
Re: Indy - Client lässt Server+andereClients abstürzen.
Zitat:
habe weder in der hilfe, noch in google dazu was gefunden. gruss Corgan |
Re: Indy - Client lässt Server+andereClients abstürzen.
kann es sein das du die applicationen aus delphi heraus startest und du delphi zulässt das es bei einer exception das prog debuggt ?
wenn ja dann ists doch klar wieso alles hängen bleibt.. client verreckt, server macht eine exception die delphi wiederum debuggen will und den server einfrieren lässt und somit verreckt der andere client auch weil er *vielleicht* dadurch die verbindung verliert o.ä. * nur so ne vermutung * hab ich auch am anfang mit internet programmierung so meine problemchen gehabt.. starte einfach die programme alle direkt ohne delphi und fange JEDE exception erstmal ab und lass dadurch weiter rennen |
Re: Indy - Client lässt Server+andereClients abstürzen.
In der CodeLib gibts nen Code zum abfangen der Fehler
|
Re: Indy - Client lässt Server+andereClients abstürzen.
also delphi exceptions werden nicht zur anzeige gebracht.
mein problem ist ja, das der server stehen bleibt, sobald ein client eine fehlermeldung bringt. ob das jetzt ne delphi exception, oder ne normale fehlermeldung ist, spielt da ja eigentlich keine rolle. DENN, nehmen wir mal an, ich würde eine Art ICQ Programmieren und ein Client der zu meinem Server verbunden ist, debugt das Ding auf einmal. Dann darf ja logischerweise nicht mein Server stehen bleiben.... Im Moment bleibt nicht nur der Server stehen, sondern nimmer noch alle anderen Clients mit. Ich versuche grade zu verstehen, an welcher Stelle der Server stehen bleibt. So wie ich das mit dem Thread verstanden habe, wird der bei excecute nur einmal abgearbeitet und wartet dann auf den nächsten excecute. Sollte also keine Probleme machen. Aber der Server schreibt ja auch Broadcast an alle Clients, die er in seiner Server.Thread.Locklist hat.
Delphi-Quellcode:
Da der Abgestürtzte Client da ja noch drin steht, der Server aber nicht auf den schreiben kann, macht er schlapp ??
procedure TMainFrm._send(command,msg,receiver: string);
var CommBlock : TCommBlock; Count: Integer; List : TList; begin if (MainFrm.Server.Active = true) then begin try CommBlock.Command := command ; // assign the data CommBlock.MyUserName := 'hauptsystem'; CommBlock.Msg := msg; CommBlock.ReceiverName := receiver; List := Server.Threads.LockList; try for Count := 0 to List.Count -1 do try TIdPeerThread(List.Items[Count]).Connection.WriteBuffer (CommBlock, SizeOf (CommBlock), true); except TIdPeerThread(List.Items[Count]).Stop; end; finally Server.Threads.UnlockList; end; except on E: Exception do fehlermeldung('_send_to_hs:'+ E.Message + '( to:' + receiver + 'cmd:' + command + ' msg:'+ msg + ')'); end; Nur wie prüfe ich jetzt, ob der Client noch lebt ?? gruss Corgan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz