WebSocket Verbindung wird scheinbar nicht geschlossen !

Alle Fragen zur Netzwerkkommunikation
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von pluto »

Das Problem hat mich wieder eingeholt:
wenn ich nicht wieder SetLinger(true, 1000); // 10000
hinschreibe, können z.b. keine *.js Dateien vom WebSocketserver gesendet werden bzw. vom Browser Empfangen werden.

In der blcksock.pas steht folgendes zu "SetLinger"
{:Sets linger. Enabled linger means that the system waits another LINGER
(in milliseconds) time for delivery of sent data. This function is only for
stream type of socket! (TCP)}
Was ich nicht verstehe: Wenn die Angaben in ms sind, warum muss ich dann immer ca 30 bis 60 Sekunden warten?
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von af0815 »

Von der Zeitdauer her schaut das nach einem Timeout aus, nachdem du wieder den Socket nutzen kannst.

Ein bischen an Info findet man hier https://stackoverflow.com/questions/375 ... 0-required , da wird ein wenig erklärt wie das abläuft.

Besser ist noch diese laaaange Erkläreung http://www.serverframework.com/asynchro ... rvers.html

alles leider in englisch, aber die Probleme liegen im Protokoll und dem Socket.

Edit: Ist der Client auch von Dir ? Nachdem durchlesen des obigen beschleicht mich der Verdacht, das man den Client auch das Protokoll sauber beibringen muß.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von pluto »

Edit: Ist der Client auch von Dir ?
Der Client ist nicht von mir. Der Client kommt von hier:
http://code.google.com/p/bauglir-websocket

Ich habe ihn über die Jahre hin weg erweitert und verändern, aber das Problem liegt gibt es auch im Original.
Der Punkt ist jedoch: z.b. NodJS, hat damit kein Problem wenn ich dort ein WebSocketServer erstelle....

Leider wird das Projekt vom Autor nicht mehr Weiter entwickelt.

Ich habe den Eindruck, es liegt nur an diesen "SetLinger".... ich weiß gar nicht, warum das über ein Timeout gemacht wird und nicht gewartet wird, bis keine Zeichen mehr kommt. Ich verstehe auch die Zeitdauer nicht. Angeblich sind es Millisekunden, ich muss aber deutlich länger warten.

Edit1:
The typical reason to set a SO_LINGER timeout of zero is to avoid large numbers of connections sitting in the TIME_WAIT state, tying up all the available resources on a server.
Genau das ist das Problem, denke ich.
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von af0815 »

Das Problem ist, das der Socket genaugenommen vom Client die Freigabe zum schliessen bekommen muss und zusätzlich noch in einem TIME_WAIT Stadium gehalten wird, bis sichergestellt ist, das die Verbindung sicher abgebaut ist.
Das Timeout was du beobachtest ist die Maximum Segment Lifetime (MSL).
http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html hat geschrieben:Different implementations select different values for MSL and common values are 30 seconds, 1 minute or 2 minutes. RFC 793 specifies MSL as 2 minutes and Windows systems
Die kannst du mit dem Linger etwas runterwürgen (was lt. den Infos nicht ganz sauber ist).

Bei deiner Anwenung solte es vermeidbar sein, wenn du einen Socketpool hast und im Pool ganz einfach die TIME_WAIT ablaufen kann. Ansonsten bleibt nur der harte Weg, sich den bauglir-websocket genauer anzusehen. Besonders wie der sich abbaut.

Warf könnte schon recht gehabt haben, den nicht weiter zu verfolgen. Zumindest musst du die Wartung selbst übernehmen, nachdem der nicht mehr aktiv gepflegt wird.

Edit: Hier ist eine Kopie auf Github mit einem Beispiel https://github.com/Robert-112/Bauglir-WebSocket-2
Ist bei diesem Beispiel auch das Verhalten nachvollziehbar ? Oder nur bei deinem COde ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von pluto »

Bei deiner Anwenung solte es vermeidbar sein, wenn du einen Socketpool hast und im Pool ganz einfach die TIME_WAIT ablaufen kann. Ansonsten bleibt nur der harte Weg, sich den bauglir-websocket genauer anzusehen. Besonders wie der sich abbaut
Da bin ich schon eine ganze weile immer wieder dabei. Bisher habe ich es noch nicht zu 100% nachvollziehen können, aber meiner Meinung nach wird, alles richtig abgebaut. auch ein SetLinger(true,0) hilft nicht, vor dem schließen der Verbindung, in diesen Fall, laden die externen Script Dateien wieder nicht.
Warf könnte schon recht gehabt haben, den nicht weiter zu verfolgen. Zumindest musst du die Wartung selbst übernehmen, nachdem der nicht mehr aktiv gepflegt wird.
Ich habe auch sein Projekt getestet, es zeigt das gleiche verhalten. Das macht ganze so unüberschaubar.
Nur bei seinem Projekt tritt es nicht bei jedem schließen auf, vielleicht nur bei jeden 2 oder 3. mal.
Edit: Hier ist eine Kopie auf Github mit einem Beispiel
ich hatte mir mal eine neue Version gezogen von einem anderen git. das war sogar das git, auch hier ist das verhalten zu beobachten. Wie ich schon geschrieben habe, nicht nur in meinem veränderten Code. Es scheint ein Grundlegendes Problem mit Sockts zu sein.

Wie gesagt. NodeJS hat dieses Problem scheinbar nicht.
MFG
Michael Springwald

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von kupferstecher »

Basiert die Bibliothek auf Synapse?

Mit Synapse hab ich auch schon laenger gekaempft was das Schliessen des Programms anbelangt mit anschliessend blockierten Ports. Egal ob die Verbindung mit AbortSocket oder CloseSocket beendet wurde, die gleichen Probleme.

SetLinger war die eine Stelle, die Probleme gemacht hat, das andere war der Timeout beim Lesen. Also wenn ich AbortSocket gerufen habe, waehrend die Verbindung noch stand.

Die Loesung war in Synapse den 'Heartbeat' zu aktivieren. Wenn ich mich richtig erinner, braucht man keinen Callback einrichten fuer den Heartbeat. Die Zeit setzen und aktivieren reicht.

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von sstvmaster »

LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von pluto »

kupferstecher hat geschrieben:Basiert die Bibliothek auf Synapse?
Genau. Das ist aber kein Hauptgrund. Auch die Version von Warf zeigt dieses Verhalten hin und wieder...
kupferstecher hat geschrieben:Mit Synapse hab ich auch schon laenger gekaempft was das Schliessen des Programms anbelangt mit anschliessend blockierten Ports. Egal ob die Verbindung mit AbortSocket oder CloseSocket beendet wurde, die gleichen Probleme.
Genau, an dieser Stelle bin auch.
kupferstecher hat geschrieben:SetLinger war die eine Stelle, die Probleme gemacht hat, das andere war der Timeout beim Lesen. Also wenn ich AbortSocket gerufen habe, waehrend die Verbindung noch stand.
Beim lesen? Ich hatte mal ein Timeout gesetzt nur fürs schreiben, aber das gleiche Problem.
kupferstecher hat geschrieben:Die Loesung war in Synapse den 'Heartbeat' zu aktivieren. Wenn ich mich richtig erinner, braucht man keinen Callback einrichten fuer den Heartbeat. Die Zeit setzen und aktivieren reicht.
Teste ich aus... Auf diese Idee, wäre ich jetzt nicht gekommen.
sstvmaster hat geschrieben:Doku Synapse Heartbeat
Danke für den Link, ich schaue ihn mir an, vielleicht bringt das neue Erkenntnisse.

Edit1: Ich habe versucht an verschiedenen Stellen den Heartbeat zu aktivieren. Dabei habe ich die "HeartbeatRate" auf 2000 gestellt.
hat aber keine Auswirkungen.
MFG
Michael Springwald

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von sstvmaster »

Hallo Michael,

kannst du ein minimal Beispiel zusammenstellen, wenn möglich?
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von sstvmaster »

Ich weiss nicht ob der Link schon mal gepostet wurde, hier wird das gleiche behandelt.

https://sourceforge.net/p/synalist/mail ... e/6575450/

Speziell mal diesen Teil aus einem Link von oben.

http://www.ssfnet.org/Exchange/tcp/tcpT ... es.html#ST
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
kupferstecher
Beiträge: 418
Registriert: Do 17. Nov 2016, 11:52

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von kupferstecher »

pluto hat geschrieben:
Mi 27. Mai 2020, 13:10
Dabei habe ich die "HeartbeatRate" auf 2000 gestellt. hat aber keine Auswirkungen.
Wie gesagt, das Problem kam bei mir, wenn ich den Socket "gefreet" habe bevor die Verbindung offiziell beendet war.
Das heißt, du solltest überprüfen, ob alle Verbindungen beendet wurden, befor du ServerSocket.Free aufrufst.

Ich würde dir meinen Code zeigen, aber der ist recht kompliziert, weil ich noch eine Datenstruktur für jeden Thread hinterlegt habe.

Wie ssvtmaster schrieb, am Besten du stellst ein Minimalbeispiel ein.

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von sstvmaster »

Schau mal hier der 1. und 2. Beitrag, vielleicht gibts da auch ein paar Anregungen.

https://forum.lazarus.freepascal.org/in ... ic=21024.0
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von pluto »

kupferstecher hat geschrieben:Wie ssvtmaster schrieb, am Besten du stellst ein Minimalbeispiel ein.
Ich Arbeite an einen Minimal beispiel.
sstvmaster hat geschrieben:Schau mal hier der 1. und 2. Beitrag, vielleicht gibts da auch ein paar Anregungen.
schau ich mir gleich mal an, danke !
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von pluto »

Ich habe das Minimal Projekt fertig.
Leider ist die Datei zu groß für das forum: 704,9 KB, früher ging meine ich bis zu 5 mb?
werde ich noch mal in den einen Thread erwähnen.

Edit01: Ich habe den google-link entfernt und auch "bootstrap-4.0.0-dist", dass hat ein groß Teil des Speichers ausgemacht im Archiv.
Bootstrap-4.0.0-dist müsst ihr dann noch selbst runderladen:
https://github.com/twbs/bootstrap/relea ... 0-dist.zip

Zum Kompilieren wird noch synapse benötigt.
pl_mp_client_web_src.zip
(131.52 KiB) 173-mal heruntergeladen
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von pluto »

Damit es eine Änderungs E-Mail gibt: Ich habe die vorherige Antwort angepasst und den Google-drive Link entfernt !
MFG
Michael Springwald

Antworten