Socket-Verbindung absichern
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Socket-Verbindung absichern
Ich habe die hier ausführlich diskutierte Socketverbindung vergangene Woche scharf geschaltet. Und erwartungsgemäß lief auch alles sauber durch.
Aber heute früh habe ich das routinemäßig kontrolliert, und mußte leider feststellen, daß das Programm komplett abgestürzt war. Nun gibt es keine Arrays, die irgendwann mal überlaufen können, oder sonstige Fallstricke, die nicht sofort aufgefallen wären. Mehrere Tage lang lief das sauber, dann kurz nach Mitternacht Exitus.
Nun stellt sich mir die Frage, woran das gelegen haben könnte. Als Einziges kommt mir die Socket-Verbindung in den Sinn, die eventuell unterbrochen gewesen sein könnte. Unterstützt wird das durch die Aussage des Admins, das auch immer mal Pings in den Switches verloren gehen. Ich habe erstmal eine Routine eingebaut, die um Mitternacht die Verbindung löscht, und neu aufbaut. In der Hoffnung, daß das eine mögliche Überlastung durch Dauerbetrieb verhindert.
Ich kann aber nicht glauben, das ein Socket-Dauerbetrieb ein Problem darstellen könnte.
Wie also könnte ich eine Überprüfung einbauen, die im laufenden Betrieb klärt ob die Verbindung steht, eventuell kurz wartet, und wenn das immer noch nicht klappt, die alte sauber schließt und eine neue aufbaut? Ich hab mal die SocketSelect() versucht, aber die gibt mir immer nur zurück, das die Parameter falsch wären. Obwohl die alle optional sind, und ich nur das Array an Pos. 4 und die Fehlerauswertung an Pos. 5 gesetzt hatte. Oder wäre SocketSelect() garnicht der richtige Weg?
Jan
Aber heute früh habe ich das routinemäßig kontrolliert, und mußte leider feststellen, daß das Programm komplett abgestürzt war. Nun gibt es keine Arrays, die irgendwann mal überlaufen können, oder sonstige Fallstricke, die nicht sofort aufgefallen wären. Mehrere Tage lang lief das sauber, dann kurz nach Mitternacht Exitus.
Nun stellt sich mir die Frage, woran das gelegen haben könnte. Als Einziges kommt mir die Socket-Verbindung in den Sinn, die eventuell unterbrochen gewesen sein könnte. Unterstützt wird das durch die Aussage des Admins, das auch immer mal Pings in den Switches verloren gehen. Ich habe erstmal eine Routine eingebaut, die um Mitternacht die Verbindung löscht, und neu aufbaut. In der Hoffnung, daß das eine mögliche Überlastung durch Dauerbetrieb verhindert.
Ich kann aber nicht glauben, das ein Socket-Dauerbetrieb ein Problem darstellen könnte.
Wie also könnte ich eine Überprüfung einbauen, die im laufenden Betrieb klärt ob die Verbindung steht, eventuell kurz wartet, und wenn das immer noch nicht klappt, die alte sauber schließt und eine neue aufbaut? Ich hab mal die SocketSelect() versucht, aber die gibt mir immer nur zurück, das die Parameter falsch wären. Obwohl die alle optional sind, und ich nur das Array an Pos. 4 und die Fehlerauswertung an Pos. 5 gesetzt hatte. Oder wäre SocketSelect() garnicht der richtige Weg?
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Re: Socket-Verbindung absichern
Hallo Jan,
wenn du ein Gartenschlauch durchschneidest, fließt leider kein Wasser mehr durch.
Genauso ist es auch bei einer Socket-Verbindung: du hast zwar noch den Pointer auf diese, kannst aber damit nicht mehr arbeiten, weil die Verbindung nicht mehr da ist und das ganze zu einem Runtime-Fehler führen kann.
Die Probleme mit unterbrochenen Netzwerkverbindungen bestehen immer. Du muss dein Programm so erweitern, dass es damit umgehen kann.
Ich habe jetzt die Befehle nicht vor mir, deswegen kann ich dir nur die Möglichkeiten anbieten:
1. Bevor du die Daten sendest oder empfängst, musst du den Status der Verbindung prüfen.
2. Sende-/Empfangsbefehl in Begin Sequence umschließen und den Fehler abfangen.
3. Bei Fehler kannst du den Fehlercode prüfen und dem entsprechend reagieren.
4. Wenn nichts mehr geht, dann die Verbindung zum Server neu aufbauen.
Ich würde an deiner Stelle das ganze in eine Klasse packen, um besser reagieren zu können. In den Sende-/Empfangs-Methoden die Prüfung einbauen.
wenn du ein Gartenschlauch durchschneidest, fließt leider kein Wasser mehr durch.
Genauso ist es auch bei einer Socket-Verbindung: du hast zwar noch den Pointer auf diese, kannst aber damit nicht mehr arbeiten, weil die Verbindung nicht mehr da ist und das ganze zu einem Runtime-Fehler führen kann.
Die Probleme mit unterbrochenen Netzwerkverbindungen bestehen immer. Du muss dein Programm so erweitern, dass es damit umgehen kann.
Ich habe jetzt die Befehle nicht vor mir, deswegen kann ich dir nur die Möglichkeiten anbieten:
1. Bevor du die Daten sendest oder empfängst, musst du den Status der Verbindung prüfen.
2. Sende-/Empfangsbefehl in Begin Sequence umschließen und den Fehler abfangen.
3. Bei Fehler kannst du den Fehlercode prüfen und dem entsprechend reagieren.
4. Wenn nichts mehr geht, dann die Verbindung zum Server neu aufbauen.
Ich würde an deiner Stelle das ganze in eine Klasse packen, um besser reagieren zu können. In den Sende-/Empfangs-Methoden die Prüfung einbauen.
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Re: Socket-Verbindung absichern
Du kannst dein Problem am Samstag mitbringen, damit wir es zusammen ansehen können, falls es bis dahin noch nicht gelöst seien sollte!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Socket-Verbindung absichern
Fragt sich natürlich, warum die Socketverbindung permanent offen sein muß! Warum nicht jedesmal vor dem Zugriff Verbindung aufbauen, Daten senden, Verbindung trennen?
Ist die Latenz so stark und das Intervall so kurz, dass diese Möglichkeit ausscheidet?
Viele Grüße,
Martin
Ist die Latenz so stark und das Intervall so kurz, dass diese Möglichkeit ausscheidet?
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Socket-Verbindung absichern
Hallo Andreas und Martin,
das Datenholen läuft in einer Do While-Schleife. Ohne Ausstiegspunkt. In jedem Durchlauf holt der genau 1 Zeichen aus dem Socket-Datenstrom.
Ich kann den auch nicht ständig beenden und neu starten - bei jedem Neustart werden komplett alle Knoten des Gira-Servers übermittelt. Das würde mir das ganze System total ausbremsen.
Mir schwebt vor, in jedem Schleifendurchgang einfach kurz zu checken, ob die Socketverbindung noch steht. Und notfalls die dann doch neu aufzubauen. Aber eben nur dann, wenn die aus welchem Grund auch immer unterbrochen worden ist.
Jan
das Datenholen läuft in einer Do While-Schleife. Ohne Ausstiegspunkt. In jedem Durchlauf holt der genau 1 Zeichen aus dem Socket-Datenstrom.
Ich kann den auch nicht ständig beenden und neu starten - bei jedem Neustart werden komplett alle Knoten des Gira-Servers übermittelt. Das würde mir das ganze System total ausbremsen.
Mir schwebt vor, in jedem Schleifendurchgang einfach kurz zu checken, ob die Socketverbindung noch steht. Und notfalls die dann doch neu aufzubauen. Aber eben nur dann, wenn die aus welchem Grund auch immer unterbrochen worden ist.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Re: Socket-Verbindung absichern
Hallo Jan,
hast du dir schon die Beispiele von Alaska angesehen?
Normalerweise erfragst du beim 1. Schritt, wieviele Daten dir gesendet werden und dann empfängst du alles.
hast du dir schon die Beispiele von Alaska angesehen?
Normalerweise erfragst du beim 1. Schritt, wieviele Daten dir gesendet werden und dann empfängst du alles.
Das ist ja genau das, was ich sage. Bei Dauerverbindung ist es der Beste Weg.Jan hat geschrieben: Mir schwebt vor, in jedem Schleifendurchgang einfach kurz zu checken, ob die Socketverbindung noch steht. Und notfalls die dann doch neu aufzubauen. Aber eben nur dann, wenn die aus welchem Grund auch immer unterbrochen worden ist.
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Socket-Verbindung absichern
Andreas,
ich kann nicht abfragen, wie viel da kommen wird. Weil das ein ständiger Datenstrom ist. Mal mehr oder weniger lange unterbrochen (der Datenstrom, nicht die Verbindung!), wenn gerade nix passiert, aber dennoch muß ich auch in der Zeit immer "ein Ohr auf der Leitung" haben.
Und zu der Art der Überprüfung hatte ich genau das auch in meinem Eingangsposting angefragt.
Jan
ich kann nicht abfragen, wie viel da kommen wird. Weil das ein ständiger Datenstrom ist. Mal mehr oder weniger lange unterbrochen (der Datenstrom, nicht die Verbindung!), wenn gerade nix passiert, aber dennoch muß ich auch in der Zeit immer "ein Ohr auf der Leitung" haben.
Und zu der Art der Überprüfung hatte ich genau das auch in meinem Eingangsposting angefragt.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Socket-Verbindung absichern
Da ja nun klar ist, das meine Eingangsfrage korrekt ist, fehlt mir noch eine Idee, wie ich vor jedem Auslesen eines Zeichens aus dem Datenstrom sicherstellen kann, das die Verbindung wirklich noch steht.
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Re: Socket-Verbindung absichern
Gar nicht - denke ich mal.
Also wirst Du - statt mit defensiven programmieren - nur mit offensiven programmieren weiterkommen: Bau eine Errorhandlingroutine drum rum!
Viele Grüße,
Martin
Also wirst Du - statt mit defensiven programmieren - nur mit offensiven programmieren weiterkommen: Bau eine Errorhandlingroutine drum rum!
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Re: Socket-Verbindung absichern
Ich mache es so, dass der normale Empfang in BEGIN SEQUENCE eingeschlossen wird. Falls ein Fehler auftritt, dann noch ein Mal versuchen und bei 2. Fehler die Verbindung neu aufbauen.
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2126
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Socket-Verbindung absichern
Bei Marshallsoft gibt es dazu die Funktion
Gibts das in Xbase++ nicht?cscIsConnected:: Returns the Current Connection Status
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
Re: Socket-Verbindung absichern
Ja, so handhabe ich das auch!!andreas hat geschrieben:Ich mache es so, dass der normale Empfang in BEGIN SEQUENCE eingeschlossen wird. Falls ein Fehler auftritt, dann noch ein Mal versuchen und bei 2. Fehler die Verbindung neu aufbauen.