Für den Administrator

Verbindungsabbruch?

Das Auftreten der clientseitigen Meldung "Kommunikation – Verbindung abgebrochen" ist, vor allem weil die Ursache oft nicht zu ermitteln ist, Grund genug ein wenig hinter die Kulissen der CONZEPT 16-Client/Server-Verbindung zu schauen.


Die Kommunikation zwischen Client und Server im lokalen Netz wird bekanntermaßen über eine socketbasierte TCP/IP-Verbindung realisiert, die bei der Anmeldung an die Datenbank aufgebaut und erst beim Abmelden der Benutzers wieder beendet wird. Im Extremfall (Jobserver oder ähnliches) besteht diese Verbindung für die Dauer von Wochen oder Monaten.

Nach dem erfolgreichen Verbindungsaufbau gibt es nur noch zwei Aktionen, die von Client und Server auf dem Socket durchgeführt werden: Lesen und Schreiben von Daten, dabei wird übrigens kein Timeout verwendet. Genauso simpel wie die Operationen selbst sind auch die Rückgabewerte durch das Betriebssystem, entweder war der Aufruf erfolgreich oder eben nicht. Im Falle eines Fehlers kann die Verbindung dann auch nicht mehr benutzt werden, eine Wiederholungsmöglichkeit gibt es ebenfalls nicht.

Neben dem ordnungsgemäßen Beenden der Verbindung durch das Schließen des Sockets per Anwendung kann die Verbindung auch jederzeit durch das Betriebssystem beendet werden. Beispielsweise führt bereits eine kurzfristige Unterbrechung der Netzwerkverbindung unter Windows zum Schließen aller offenen TCP/IP-Verbindungen.

Ohne eine Datenübertragung kann der logische Zustand der Verbindung nicht überprüft werden, ein abgeschalteter Client (ohne Herunterfahren von Anwendung oder Betriebssystem) sendet einfach keine Anfragen mehr, der Server kann nicht feststellen, ob der Client überhaupt noch läuft. Findet kein Datenaustausch statt, sendet der Socket selbstständig sogenannte Keep-Alive-Pakete, die im regelmäßigen Abstand (Standardwert ist 2 Stunden) eine Prüfung der Verbindung ermöglichen. Dies führt unter anderem zum Kommunikationsabbruch mit Clients, die sich längere Zeit im Sleep-Modus befinden und nicht auf das Keep-Alive-Paket antworten können.

Aktuell führt der Client keinen erneuten Verbindungsaufbau durch, wenn ein Socketfehler aufgetreten ist. Dies wäre auch nur dann erfolgreich, wenn der Server die Benutzersession auch nach einem Verbindungsende noch für eine gewisse Zeit aufbewahrt (und somit den Benutzer nicht sofort abmeldet). Diese Möglichkeit wird von uns noch getestet und wird eventuell in einer zukünftigen Version realisiert werden.

3 Kommentare

3 Kommentare “Verbindungsabbruch?”

  1. @Th.Eichele
    Das wird schon geloggt ("Logout <connection lost>"), leider kann die wirkliche Ursache dabei meist nicht festgestellt werden. Der Server meldet den Benutzer ab, wenn das Lesen des Sockets fehlschlägt. Bei einem solchen Fehler liefert Windows im wesentlichen vier verschiedene Errorcodes (WSANETDOWN, WSAENETRESET, WSACONNABORTED, WSAECONNRESET) die allerdings aktuell nicht im Log festgehalten werden.

  2. Schön wäre es, wenn der Server solche Abrüche in die LGB-Datei schreiben würde, wenn möglich mit der Ursaceh, swoeit eben feststellbar (Netzwerkverbindung getrennt, Client antwortet nicht, o.ä)

  3. Ein äusserst interessanter Einblick hinter die Kulisse der Kommunikation, besten Dank hierfür!

    Dass die Verbindung zum Server getrennt wird, wenn z.B. das Netzwerkkabel ausgesteckt wird, leuchtet ein. Auch dass wenn zu diesem Zeitpunkt eine Anfrage des Clients an den Server geschickt wird und dann der Client keine Lust resp. Möglichkeit mehr hat, korrekt zu arbeiten, macht ebenfalls Sinn.

    Wenn aber das Netzwerkkabel wieder eingesteckt wird, bevor der Client eine weitere Anfrage abgesendet hat, dann könnte doch rein theoretisch alles korrekt weiterarbeiten? Von diesem Unterbruch müsste doch überhaupt niemand etwas merken?

    Sowohl der Client als auch der Server wissen doch, wer sie sind und zu wem sie gehören, wenn nun einfach die Verbindung vom Client wieder aufgebaut wird und der Server bemerkt, das ist immer noch der gleiche Client wie vorher, dann könnten sich doch die beiden mit dem bestehenden Benutzer wieder verheiraten und weiterarbeiten.

    Das würde doch alle glücklich machen? Wäre echt toll, wenn hier in einem der kommenden Updates eine Verbesserung erreicht werden könnte.

Kommentar abgeben