AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Frage zum Disconnect mit Indy und einer TCP/IP Verbindung
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

Ein Thema von Harry Stahl · begonnen am 15. Jun 2015 · letzter Beitrag vom 16. Jun 2015
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.558 Beiträge
 
Delphi 12 Athens
 
#1

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 15. Jun 2015, 23:57
Ich nutze hier nur die INDY-Komponenten, spezielle Implementierungen in Bezug auf Sockets habe ich nicht vorgenommen.

Ich bin gerade dabei eine Server/Client Anwendung auf reines TCP/IP umzustellen. Zuvor hatte ich da noch eine wilde Mischung aus Mailslot-Technik (gruselig) und TCP-IP gehabt.

Nur TCP/IP zu verwenden ist da deutlich einfacher.

In einem Test gerade hier im Netz mit ca. 10 Rechnern (Verbindung teils über festes Netzwerk, teils WLan), teils Desktop, teils Notebook stellten sich folgende Probleme dar:

Die Notebooks gingen relativ schnell "schlafen" und bekamen daher einige Meldungen vom Server nicht mehr mit. Hier stellt sich die Frage, wie mit dieser Situation umgehen:

Die Notebooks, wenn man feststellt, dass die in den Tiefschlaf gehen, automatisch vom Server trennen? Oder, wenn wieder wach, die Datendatei aktualisieren / automatisch neu laden?

Wie geht Ihr mit solchen Situationen um, damit die Konsistenz des Datenbestandes auf allen Rechner erhalten bleibt?
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#2

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 16. Jun 2015, 02:38
Das ist so allgemein schwer zu sagen, da ich deinen genauen Anwendungszweck nicht kenne.

Ich kann dir mal ein Beispiel geben, wie MySQL das macht. MySQL unterstützt einen Master-Slave-Modus, bei denen die Slaves ihren Datenbestand synchron zum Master halten. MySQL führt dabei eine Nummer mit, die mit jeder Änderung am Datenbestand erhöht wird. Die Slaves sind mit dem Master verbunden und führen Änderungen sequentiell ein. Startest du einen Slave neu, so beginnt er, dieses s.g. "Backlog" von seinem letzten Datenstand aufzuholen.

Das klappt soweit meistens ganz gut. (Ich will nicht sagen dass das problemlos klappt, aber das Problem ist meist eher MySQL als dieses System)

Es gibt einige Situationen, in denen man daran per Hand rumwerkeln muss. Beispielsweise führt der Server sein Backlog (also die Liste der Änderungen am Datenbestand) nicht unendlich lang. Ist ein Slave langer offline als das Backlog alt ist, so kann er den Bestand nicht mehr automatisch abgleichen. In dem Fall muss man vorgehen, wie man es auch beim Hinzufügen eines neuen Slaves tut. Dazu stellt man sicher, dass der Master seine Daten nicht mehr ändert (er speichert Änderungen solange im RAM) und macht ein Backup. Das Backup wird auf neue Slaves eingespielt. Der Master darf dann weiterarbeiten. Wichtig ist, das man vor dem reaktivieren des Masters aufschreibt, welche Revisionsnummer (also die Position im Backlog bzw. die Nummer die zur Synchronisation dient) das Backup hat. Nach dem Einspielen des Backups auf den Clients gibt man ihnen diese Nummer mit und sie sind wieder automatisch in der Lage synchron zum Master zu bleiben.

Im Prinzip also eine Mischung aus beiden deiner Vorschläge. Das komplette Neuladen der Datenbestände muss man in MySQL leider manuell machen, das ließe sich aber bestimmt automatisieren in deinem Programm.

Hilft dir das eventuell weiter als Ansatz?
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.558 Beiträge
 
Delphi 12 Athens
 
#3

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 16. Jun 2015, 09:59
Das ist so allgemein schwer zu sagen, da ich deinen genauen Anwendungszweck nicht kenne.
Es ist eine Client-Server Anwendung, wo für mehrere Anwender im Netz eine gemeinsame Termindatenbank verwaltet wird. Der Server verwaltet dabei die Datenbank (Clients fragen also an, ob sie einen Datensatz bearbeiten oder einfügen können, Server gibt OK, Client liefert dann die neuen oder geänderten Daten. Server verteilt neue oder geänderte Daten an andere Clients, die gerade im Netz mit dieser Datenbank verbunden sind).

Ich kann dir mal ein Beispiel geben, wie MySQL das macht. MySQL unterstützt einen Master-Slave-Modus, bei denen die Slaves ihren Datenbestand synchron zum Master halten.
Ja, so mache ich das im Prinzip auch.

MySQL führt dabei eine Nummer mit, die mit jeder Änderung am Datenbestand erhöht wird. Die Slaves sind mit dem Master verbunden und führen Änderungen sequentiell ein. Startest du einen Slave neu, so beginnt er, dieses s.g. "Backlog" von seinem letzten Datenstand aufzuholen.
Auch ein interessanter Ansatz. Das würde sogar "Offline"-Arbeiten mit dem Datenbestand ermöglichen.

Im Prinzip also eine Mischung aus beiden deiner Vorschläge. Das komplette Neuladen der Datenbestände muss man in MySQL leider manuell machen, das ließe sich aber bestimmt automatisieren in deinem Programm.

Hilft dir das eventuell weiter als Ansatz?
Ja danke, das sind gute Ideen, um hier noch Erweiterungen / Verbesserungen einführen zu können.

Da die Datenbank i.d.R. maximal nur einige MB einnimmt, wäre auch ein stiller Reload machbar, wenn der Client merkt, er hat das eine oder andere verpasst.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

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

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 16. Jun 2015, 10:26
Auch ein interessanter Ansatz. Das würde sogar "Offline"-Arbeiten mit dem Datenbestand ermöglichen.
Wenn im Offline-Betrieb geschreiben werden soll, wird es sehr schnell wieder kompliziert. Manuelles Zusammenführen ist mühsam, vollautomatisches könnte zu Datenverlust führen.

Oder gibt es auch eine spezielle, ich gehen jetzt in den Energiespar-Modus Nachricht?
Natürlich
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.558 Beiträge
 
Delphi 12 Athens
 
#5

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 16. Jun 2015, 10:32
[QUOTE=BUG;1305239]Danke Bug, genau das war gemeint.
  Mit Zitat antworten Zitat
mm1256

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

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 16. Jun 2015, 10:47
Hallo,

vielen Dank! Das ist genau das was ich gesucht habe!
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
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 16. Jun 2015, 10:52
Hallo,

vielen Dank! Das ist genau das was ich gesucht habe!
Das kam jetzt aber aus dem nichts
Chris
  Mit Zitat antworten Zitat
mm1256

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

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 16. Jun 2015, 05:59
Die Notebooks gingen relativ schnell "schlafen" und bekamen daher einige Meldungen vom Server nicht mehr mit. Hier stellt sich die Frage, wie mit dieser Situation umgehen:

Die Notebooks, wenn man feststellt, dass die in den Tiefschlaf gehen, automatisch vom Server trennen? Oder, wenn wieder wach, die Datendatei aktualisieren / automatisch neu laden?

Wie geht Ihr mit solchen Situationen um, damit die Konsistenz des Datenbestandes auf allen Rechner erhalten bleibt?
So macht es z.B. NexusDB, die ja bekanntlich komplett in Delphi programmiert ist: Der Client sendet permanent (in einem eigenen Thread) einen Heartbeat. Wenn der Server nach einer einstellbaren Zeit (üblich sind 10 Sekunden) keinen Heartbeat mehr erhält, trennt er die Verbindung. Somit bleiben keine Verbindungsleichen übrig. ReConnect nach "Tiefschlaf" kann/muss der Client durchführen.

Was mich an der Stelle auch mal interessieren würde: Bekommt man es eigentlich vorher mit (Message? Frage an die API-Spezies), dass Windows beabsichtigt den Rechner in den Ruhezustand zu versetzen? Dann könnte man clientseitig reagieren.
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
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#9

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 16. Jun 2015, 08:16
Ja die Message gibt es.

Eine schnelle Suche ergab:

WM_ENDSESSION message

https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

In den Kommentare steht aber, dass man evtl. nur sehr wenig Zeit zur Verfügung hat bis der eigene Prozess abgewürgt wird.
Ich würde da eher einen Ticken früher sichern, egal ob sich der Benutzer des Rechners es anders überlegt und doch nicht herunterfährt.

WM_QUERYENDSESSION message

https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

Notfalls kann man den Shutdown verhindern indem der Rückgabewert auf False gesetzt wird.

Findet sich auch schon im Forum:
Hier im Forum suchenAnwendung beenden bei Windows Shutdown (WM_QueryEndSession)
Chris

Geändert von Photoner (16. Jun 2015 um 08:38 Uhr) Grund: Antwort war zu kurz.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.558 Beiträge
 
Delphi 12 Athens
 
#10

AW: Frage zum Disconnect mit Indy und einer TCP/IP Verbindung

  Alt 16. Jun 2015, 10:19
[QUOTE=Photoner;1305223]Ja die Message gibt es.

Eine schnelle Suche ergab:

WM_ENDSESSION message

https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

Ich glaube, es geht hier nicht das Herunterfahren. Die Notebooks schalten die Bildschirm ab und sind in einer Art Energiesparmodus. Ein Tastendruck und sie sind direkt wieder da. Allerdings wird hier ein Anmeldebildschirm angezeigt (wo ich aber kein Passwort erneut eingeben muss, da ich das so eingestellt habe). Also wird es eher um eine Abmeldenachricht gehen. Oder gibt es auch eine spezielle, ich gehen jetzt in den Energiespar-Modus Nachricht?

Die Clients empfangen jedenfalls keine Nachrichten vom Server, wenn sie in diesem Energiesparmodus sind (hier im Beispiel Windows 8.1 auf dem Surface Pro 3).
  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 20:08 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