Entwickler-Ecke
Internet / Netzwerk - Winsockets - Server stürzt ab - Reconnecten
Marco D. - Di 16.08.05 17:26
Titel: Winsockets - Server stürzt ab - Reconnecten
Wenn der Clientsocket mit dem Serversocket verbunden ist und die Verbindung abbricht, weil der Serversocket abstürzt und das Serverprogramm beendet wurde. Dann sind ja die Clientsockets noch aktiv. Wie kann man sie dazu bringen, damit sie nach abbruch der verbindung in einem bestimmten zeitintervall versuchen eine Vebrindung erneut herzustellen. Z.B:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure tform1.clientsocket1ondisconnect (sender:tobject); begin clientsocket1.close; sleep(200); clientsocket1.open; end; |
Wie geht das richtig?
Narses - Di 16.08.05 17:53
Moin!
Zunächstmal: Wenn der ServerSocket nicht mehr zur Verfügung steht, weil der Server "abgestürzt" ist, dann landest du nicht im .OnDisconnect(), sondern im .OnError()-Ereignis und ggfs. gibt´s auch noch ne Exception. :!:
Weiterhin: Wie willst du unterscheiden, ob der Server dich nicht einfach nur kicken wollte, wer sagt denn gleich, dass der immer auch sofort "abstürzt"? Problem ist also: Wie willst du einen ungewollten von einem gewollten Disconnect unterscheiden?
Ich rate davon ab, auto-reconnects zu versuchen; wenn man es nicht richtig anstellt (und dazu gehört auch eine Timeout-Behandlung!), dann führt das zu einer Endlosschleife mit überflüssigem Netzwerk-Traffic.
cu
Narses
Marco D. - Mi 17.08.05 19:20
Titel: SOckets
@ Narses
Unterscheiden zwischen gewollt und ungewollt kann ich schon. Wenn die Verbindung gekappt wird, dann ist das ungewollt. Wenn ich die Verbindung 'Gewollt' beenden will, dann wird das geanze clientprogramm ganz ausgemacht.
Könntest du mir denn jetzt bitte einen Lösungsvorschlag geben? Danke!
Koller
starsurfer - Mi 17.08.05 20:12
nehm doch einfach ein timer den du auf z.B. 30 sec einstellst und immer aktivierst wenn der server flöten gegangen is...
im ereignis OnTime versuchst du halt wieder zum server zu connecten
sollte das funktionieren wird der timer wieder ausgeschalten...
andernfalls kannst du ja einfach die versuche zählen und bei 10 aufhören es weiter zu versuchen...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin versuch:=0; timer1.Enabled:=true; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin try; clientsocket1.Socket.Disconnect; clientsocket1.Socket.Connect; except; inc(versuch); showmessage('Verbindung fehlgschlagen'); if versuch=10 then timer1.enabled=false; end; end;
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin timer1.Enabled:=false; end; |
is recht einfach und ich denke so würde es laufen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!