AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Wie erkennt Client wenn Server disconnected
Thema durchsuchen
Ansicht
Themen-Optionen

Wie erkennt Client wenn Server disconnected

Ein Thema von Sim_Star · begonnen am 18. Nov 2014 · letzter Beitrag vom 17. Jul 2015
Antwort Antwort
Seite 1 von 2  1 2      
Sim_Star

Registriert seit: 18. Jan 2006
Ort: Krostitz
63 Beiträge
 
#1

Wie erkennt Client wenn Server disconnected

  Alt 18. Nov 2014, 18:58
Hallo, ich bin dabei eine Server und Client Anwendung zu schreiben.

Ich verwende als Server die Komponente ServerSocket und als Client die Komponente ClientSocket.

Bisher erkennt der Server wenn ein Client verbindet oder sich trennt sowie welcher Client dies war.
Wenn man nun aber die Serveranwendung schließt und dann wieder öffnet, so verbindet sich der Client nicht neu, weil er anscheinend noch verbunden ist.

Wie bekomme ich nun hin, dass der Client merkt, dass sich die Serveranwendung schließt.
Serverseitig gibt es ja die Methode ServerClientDisconnect über die ich erkenne wenn sich ein CLient trennt.... gibt es sowas nicht auch Clientseitig?
  Mit Zitat antworten Zitat
Tiffy

Registriert seit: 5. Jun 2015
1 Beiträge
 
#2

AW: Wie erkennt Client wenn Server disconnected

  Alt 7. Jun 2015, 19:09
Wie wäre es mit einem Timeout? Client fragt den Server ob er noch da ist. Entweder es gibt eine Antwort, oder es gibt keine.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Wie erkennt Client wenn Server disconnected

  Alt 7. Jun 2015, 19:48
Verschicke einfach ein Keep-Alive paket, z.b. innerhalb deines Protokolls ein 'X'. Der Server/die Gegenstelle muss dann mit einem 'Y' antworten. Das machst Du alle paar M Sekunden.

1. Der Client verschickt ein 'X'. Wenn nach M/2 Sekunde kein 'Y' kommt, ist die Verbindung tot.
2. Wenn der Server nicht alle M*1.2 Sekunden ein 'X' bekommt, ist der Client tot.

So wissen beide, wer wann tot ist. Man muss nur das Interval auf beiden Systemen gleich machen.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Wie erkennt Client wenn Server disconnected

  Alt 7. Jun 2015, 20:05
Verschicke einfach ein Keep-Alive paket, z.b. innerhalb deines Protokolls ein 'X'. Der Server/die Gegenstelle muss dann mit einem 'Y' antworten. Das machst Du alle paar M Sekunden.

1. Der Client verschickt ein 'X'. Wenn nach M/2 Sekunde kein 'Y' kommt, ist die Verbindung tot.
2. Wenn der Server nicht alle M*1.2 Sekunden ein 'X' bekommt, ist der Client tot.

So wissen beide, wer wann tot ist. Man muss nur das Interval auf beiden Systemen gleich machen.
Ja, wenn es sich um UDP handelt.. Das hat er aber nicht genauer spezifiziert. Wenn es TCP ist, dann ist das irrelevant!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wie erkennt Client wenn Server disconnected

  Alt 7. Jun 2015, 20:15
Auch wenn bei TCP der Server verschwindet, dann bekommt der Client das nicht sofort mit, sogar Windows kann den Port noch etwas offen halten (manchmal sogar stundenlang)
das geht bis dahin, daß man die "kaputte" Verbindung nicht mehr tennen kann.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#6

AW: Wie erkennt Client wenn Server disconnected

  Alt 7. Jun 2015, 20:41
> gibt es sowas nicht auch Clientseitig?

ja, gibt es natürlich

Hi .. bei einer TCP Socket Verbindung (z.b. mit einer Indy Komponente) gibt es ein Event "Disconnect".
Beidseitig für Server und Client, sollt einer die Verbindung abbauen.

Sollte jemand einfach nur das Netzwerkkabel ziehen, dann bekommst Du eigentlich immer innerhalb einer Minute das Disconnect dennoch mit.

Bei UDP gibts sowas gar nicht. Pakete werden einfach verschickt und kommen entweder an oder nicht an.

Client und Server müssen selbst die Empfangs-Bestätigung einer Message implementieren, wenn dies gewünscht (z.b. aufsteigende MessageID)
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: Wie erkennt Client wenn Server disconnected

  Alt 8. Jun 2015, 08:09
Wie bekomme ich nun hin, dass der Client merkt, dass sich die Serveranwendung schließt.
Serverseitig gibt es ja die Methode ServerClientDisconnect über die ich erkenne wenn sich ein CLient trennt.... gibt es sowas nicht auch Clientseitig?
Wäre das nicht ein klassischer Fall von Exception-Behandlung?
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Wie erkennt Client wenn Server disconnected

  Alt 8. Jun 2015, 08:30
Verschicke einfach ein Keep-Alive Paket
Ja, wenn es sich um UDP handelt.. Das hat er aber nicht genauer spezifiziert. Wenn es TCP ist, dann ist das irrelevant!
Äh... Nö. Das Verfahren wird in der Steuerungstechnik angewandt. Auch bei TCP-Verbindungen. Im wirklichen Leben bekommen weder Server noch Client immer mit, das eine Verbindung unterbrochen wurde. Dafür sorgen schon die intelligenten Switches.
Sollte jemand einfach nur das Netzwerkkabel ziehen, dann bekommst Du eigentlich immer innerhalb einer Minute das Disconnect dennoch mit.
Genau. 'eigentlich' . Entwickler sollten das Wort "Eigentlich" eigentlich nicht verwenden ("Eigentlich läuft das Programm", "Der Fehler dürfte eigentlich nicht auftreten" ).

In den Firmen, in denen ich gearbeitet habe, war es den Geräten egal, das sie eigentlich vom Verbindungsabbruch innerhalb einer Minute informiert sein müssten. Sie wurden es nicht. Auch nach 8 Stunden nicht. Und selbst wenn das bei einer normalen Infrastruktur nach einer Minute bekannt wird... Ist das nicht ein wenig lang?
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: Wie erkennt Client wenn Server disconnected

  Alt 8. Jun 2015, 11:20
@Dejan Vu

Es ist etwas lange her dass ich Netzwerk Programmierung betrieben habe, aber meine Erinnerung hat mich nicht getäuscht.. Siehe msdn recv()
Zitat:
Return value

If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.
Man muss keine Heartbeat Pakete unter TCP schicken. Die Programlogik funktioniert einfach normal weiter, bis bei einem rcv() ein Disconnect erkannt wird. Siehe Codesnippet aus meiner alten Library
Delphi-Quellcode:
  //...
    Result := recv(FSocket, Buffer, BufferSize, 0);
    case Result of
      0: Disconnect;
      SOCKET_ERROR:
      begin
        Result := WSAGetLastError();
        if Result = WSAEWOULDBLOCK then
          Result := 0
        else
          Disconnect;
      end;
    end;
  //...
Disconnect macht ein closesocket und setzt Disconnected boolean auf true..
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#10

AW: Wie erkennt Client wenn Server disconnected

  Alt 8. Jun 2015, 12:35
Man muss keine Heartbeat Pakete unter TCP schicken. Die Programlogik funktioniert einfach normal weiter, bis bei einem rcv() ein Disconnect erkannt wird.
Man muss nicht, man sollte aber vielleicht.
TCP-Verbindungen sollen teilweise auch lautlos den Bach runter gehen, was man dann aber erst beim Senden merken würde.

Gegen einen Heartbeat auf Anwendungsebene kann man afaik nicht so viel sagen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz