Autor Beitrag
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: Di 16.08.05 17:26 
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:

ausblenden 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?

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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


Zuletzt bearbeitet von Narses am Mi 17.08.05 23:09, insgesamt 1-mal bearbeitet
Marco D. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: 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

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
starsurfer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 334

Win 95, Win 98, Win XP, Win Vista, Linux
D5 Enterprise ,D2005, D6 Personal, Visual C++ Express 2005, C++ Builder 6 E, Dev-C++
BeitragVerfasst: 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...

ausblenden 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

_________________
GEIZ IST GEIL! - Ihr Sozialamt