![]() |
verbindung zum server? Client/server Sockets
hi,
habe eine Client/Server anwendung. Der Client sendet Daten an den Server. Wenn aber keine Internetverbindung besteht oder der server nicht erreichbar ist soll der client beim nächsten mal wenn er online ist die Daten senden. Habe jetzt nur nicht wirklich eine idee wie ich es umsetzten kann das der client prüft ob er mit dem server verbunden ist. Habe es bis jetzt so gelöst Client will Daten senden Client sendet Ping Server antwortet Pong Wenn Pong da, sendet Client die Daten was ist aber wenn kein pong kommt Verbindung trennen und wenn ich wieder Daten senden möchte versuchen wieder eine Verbindung aufzubauen? Was meint ihr? |
Re: verbindung zum server? Client/server Sockets
Du könntest die zu schickenden Daten einfach in eine Liste packen.
Wenn der Server mit Pong antwortet, gehst Du die Liste durch und sendest die Daten. Antwortet der Server nicht, fügst Du neue Daten einfach in die Liste ein und sendest erst, wenn Du wieder ein Pong vom Server bekommst. |
Re: verbindung zum server? Client/server Sockets
so habe ich es auch gemacht, nur wenn die Verbindung mal zum Server getrennt wurde muss ich sie ja wieder aufbauen.
|
Re: verbindung zum server? Client/server Sockets
Und wo ist da das Problem?
Du hast ja sicherlich eine Methode, die zum Server verbindet. Wenn Du nun keine Verbindung hast, versuchst Du wieder eine aufzubauen. |
Re: verbindung zum server? Client/server Sockets
so weit funktioniert das es ja auch aber irgend wie auch wieder nicht :)
Delphi-Quellcode:
so klappt es auch aber nicht immer wenn ich debugge und las mir "zeit" beim debuggen funktioniert es immer.....
procedure TMyClient.Send(var Cmd: TCommandHandling; SendNow : Boolean; FreeCmd : Boolean);
var s : string; StartTime : double; cs : TCriticalSection; begin if not fIsOnline then GoOnline('127.0.0.1',12345); application.ProcessMessages; cs := TCriticalSection.Create; cs.Enter; //Daten im Buffer ablegen fQoS.QoS_Buffer := fQoS.QoS_Buffer + cmd.SendFrames; //Jetzt senden oder Sammeln if not SendNow then if length(fQoS.QoS_Buffer) < fQoS.QoS_SendSize then exit; if not fIsOnline then exit;//wird bei OnConnect auf true gesetzt fPingPong.SendePing; StartTime := now + 2.2*(2.2/86400.0); //Ping gesendet warte auf Pong while (not fPingPong.fPong) and (StartTime > now) do begin sleep(1); application.ProcessMessages; end; //Ist Pong ok und zeit nicht abgelaufen, also verbunden, sende daten if fPingPong.fPong then begin fPingPong.fPong := false; //Daten senden s := fQoS.QoS_Buffer; fQoS.QoS_Buffer := ''; fClient.Socket.SendBuf(PChar(s)^,length(s)); end else // wenn kein pong server nicht da -> off if fIsOnline then GoOffline; application.ProcessMessages; //Freigeben if FreeCmd then cmd.Free; cs.Leave; end; Vielleicht findet ja jemand einen Fehler oder weis wie man es besser / eleganter lösen kann.... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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