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