WebSocket Verbindung wird scheinbar nicht geschlossen !

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

WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von pluto »

Hallo

Ich nutzte schon seit längere Zeit die WebSocket Grundlage von "bauglir".
Jedoch wird diese soweit ich gesehen habe nicht weiter entwickelt.
Kennt ihr noch alternativen?
Ich selbst habe es nur einmal versucht eine eigene Lib zu erstellen, klappte damals aber nicht.

Ich selbst habe einige Änderungen hinzugefügt, um diese Lib weiter nutzen zu können.

Das Problem, was ich schon vor meinen Änderungen hatte und immer noch habe ist:
Ich kann eine WebSocket Verbindung aufbauen, problemlos. Jedoch wird sie nicht wieder
beendet.

Ein paar Debug Infos:
CloseEvent
bubbles: false
cancelBubble: false
cancelable: false
code: 1000
composed: false
currentTarget: WebSocket {url: "ws://10.10.10.10:6062/", readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
defaultPrevented: false
eventPhase: 0
isTrusted: true
path: []
reason: "Server beendet !"
returnValue: true
srcElement: WebSocket {url: "ws://10.10.10.10:6062/", readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
target: WebSocket {url: "ws://10.10.10.10:6062/", readyState: 3, bufferedAmount: 0, onopen: ƒ, onerror: ƒ, …}
timeStamp: 6189.5999999997
type: "close"
wasClean: true
__proto__: CloseEvent

Diese Infos sehe ich im Browser, wenn ich mir den Event ausgeben lasse.

Entscheidet ist hier wohl "wasClean". Der Grund für die Schließung ist auch von meinem WebSocket Server, genau wie
der "code von 1000".
Hinweis: WasClean ist nicht jedes mal auf true, aber ob auf true oder false ist nach meinen Beobachtungen egal.

Wenn ich jetzt den WebSocketServer erneut aufrufe kommt folgende Fehler Meldung von "Synapse":
2020-03-05 13:06:24 - 98 (Address already in use)

Nun muss ich immer den Port ändern. Nach einem timeout von vielleicht 30 bis 60 Sekunden, kann ich den anderen Port weiter nutzen.

Ein netstat -nat fördert foglgednest zu tage:
netstat -nat|grep 10.10:6062
1 tcp 0 0 10.10.10.10:6062 10.10.10.10:56584 TIME_WAIT
2 tcp 0 0 10.10.10.10:56590 10.10.10.10:6062 TIME_WAIT
3 tcp 0 0 10.10.10.10:6062 10.10.10.10:56588 TIME_WAIT
4 tcp 0 0 10.10.10.10:6062 10.10.10.10:56586 TIME_WAIT


2 Fällt mir gerade auf. Vielleicht liegt es daran, aber wie kann ich die Verbindung schließen?

Ich habe mir auch schon mal ein Unveränderte Version der Lib runter geladen und es direkt mit dem Beispielen Probiert,
da ist das gleiche Problem vorhanden. Der Port wird so wie es aussieht NICHT frei geben.

Damit die Verbindung Überhaupt erst gelöscht wird, musste ich folgendes in meiner destroy eintragen:

Code: Alles auswählen

destructor TPLWebSocketServer.Destroy;
begin
  WebSite.Free; StrListA.Free;
  if Assigned(Server) then begin
    Server.CloseAllConnections(1000,'Server beendet !');
    sleep(1000);
    Server.TerminateThread;
  end;
  inherited Destroy;
end; // TPLWebSocketServer.Destroy


EDIT1: Ach ja, gesucht habe ich schon, aber ich finde im Internet dazu nichts.... habe schon verschiedene dinge Probiert. Das "CloseAllConnections", habe ich z.b. aus dem "Internet".
MFG
Michael Springwald

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 787
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von fliegermichl »

Ich hatte mal so ein ähnliches Problem. Die Lösung war damals, daß von dem Prozess ein Zombie übrigbleibt um den ExitCode in Erfahrung bringen zu können. Den musste man dann erst "ernten".

Warf
Beiträge: 1527
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von Warf »

pluto hat geschrieben:Hallo

Ich nutzte schon seit längere Zeit die WebSocket Grundlage von "bauglir".
Jedoch wird diese soweit ich gesehen habe nicht weiter entwickelt.
Kennt ihr noch alternativen?
Ich selbst habe es nur einmal versucht eine eigene Lib zu erstellen, klappte damals aber nicht.


Ich hab demletzt eine geschrieben und im englisch sprachigen forum vorgestellt: https://forum.lazarus.freepascal.org/in ... 565.0.html

Hatte ich gemacht weil die bauglir nicht ganz meinen Erwartungen entsprochen hat (u.a. verlässt die sich das CheckSynchronize aufgerufen wird), bzw. generell habe ich ein andere Vorstellung von Threading als bauglir

pluto
Lazarusforum e. V.
Beiträge: 7097
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 »

fliegermichl hat geschrieben:Ich hatte mal so ein ähnliches Problem. Die Lösung war damals, daß von dem Prozess ein Zombie übrigbleibt um den ExitCode in Erfahrung bringen zu können. Den musste man dann erst "ernten".

In der Prozess liste kann ich mein Prozess nach dem beenden nicht mehr sehen. Ich nehme an, es gibt bei mir kein Zombie, ich werde aber den Hinweis nachgehen !
danke für den Tipp.

Warf hat geschrieben:Ich hab demletzt eine geschrieben und im englisch sprachigen forum vorgestellt

Sieht gut aus, ich schaue ihn mal mal genauer an und teste, ob ich da den gleichen bzw. ähnlichen Effekt habe.

Warf hat geschrieben:Hatte ich gemacht weil die bauglir nicht ganz meinen Erwartungen entsprochen hat (u.a. verlässt die sich das CheckSynchronize aufgerufen wird), bzw. generell habe ich ein andere Vorstellung von Threading als bauglir

Ich habe mich sehr intensiv mit dem Code befasst von bauglir. Abgesehen davon das er nicht weiter entwickelt wird scheint er mir unnötig Aufwendig umgesetzt zu sein.
Es ist außerdem sehr undurchsichtig.

Das mit dem "CheckSynchronize" ist mir auch aufgefallen bzw. ähnliches. Aber ich war damals froh überhaupt eine Lib gefunden zu haben....
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7097
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 »

warf hat geschrieben:Ich hab demletzt eine geschrieben und im englisch sprachigen forum vorgestellt

Ich habe mir die git Version runtergeladen und das chat Beispiel ausprobiert
Not a Websocket Request


im Browser habe ich z.b.
http://127.0.0.1:8080
oder
http://localhost:8080
eingegeben....

Edit1: Im Terminal Fenster sehe ich auch keine Ausgaben.

Edit2: Jetzt geht, man sollte die HTML Datei öffnen. Leider sendet der Server keine HTML Datei....
Zuletzt geändert von pluto am Do 5. Mär 2020, 20:23, insgesamt 1-mal geändert.
MFG
Michael Springwald

Warf
Beiträge: 1527
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von Warf »

pluto hat geschrieben:im Browser habe ich z.b.
http://127.0.0.1:8080
oder
http://localhost:8080
eingegeben....


Ja, wenn du das im browser eingibst macht der ja ein HTTP request und kein websocket request. Die implementierung bietet keinen HTTP-Server, sondern ledigleich einen Websockets server. Wenn man beides auf der selben domain/port haben will, muss man z.B. mit einem Reverse Proxy arbeiten, der dann requests auf entweder einen HTTP server oder den Websockets Server umleitet

Wenn du den Chat ausprobieren willst musst du also eine Website aufrufen die via Javascript die verbindung herstellt. die chatClient.html macht genau das, und ist ein minimales Beispiel

pluto
Lazarusforum e. V.
Beiträge: 7097
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 »

Wenn man beides auf der selben domain/port haben will, muss man z.B. mit einem Reverse Proxy arbeiten, der dann requests auf entweder einen HTTP server oder den Websockets Server umleitet

Bauglir ändert, dass Protokoll. Geht erst mit einem normalen Web Server ran und dann wir das Protokoll geändert.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7097
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 »

leider hat dein WebSocket den gleichen Fehler:
tcp 0 0 10.10.10.10:5080 10.10.10.10:58240 TIME_WAIT

Der Port wird offen gehalten. Wenn ich den Server beende !
MFG
Michael Springwald

Warf
Beiträge: 1527
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von Warf »

pluto hat geschrieben:leider hat dein WebSocket den gleichen Fehler:
tcp 0 0 10.10.10.10:5080 10.10.10.10:58240 TIME_WAIT

Der Port wird offen gehalten. Wenn ich den Server beende !

Ja das passiert wenn 1. nicht Server.Stop bzw Server.Free aufgerufen wird oder, 2. Der Communicator nicht gefreed wird (was von TThreadedWebsocketHandler automatisch gemacht wird, wenn der Handling Thread terminiert)

Beispiel bei meinem Server, wenn du da unter dem Readln(str) das folgende einfügst:

Code: Alles auswählen

if str = 'exit' then break;

und dann einfach mal exit eintippst, während du connected bist, beendet er ganz normal, räumt alles auf, und du hast das problem nicht

Du musst halt dafür garantieren das dein Speicher aufgeräumt wird. Das Serverbeispiel ist extrem simpel gehalten und macht kein Fehlermanagement, noch dazu kommt das der Interrupt handler nicht überschrieben wird, wenn man also Strg+C drückt, abortet der einfach und kein Free/Stop wird ausgeführt (nicht mal das im finally from Server).
Das ist kein Problem in der Bibliothek, sondern wenn sie nicht vernünftig aufgeräumt wird.

Das ist übrigens ein reines Linux Problem, windows schließt alle Sockets wenn ein Prozess gekillt wird.

pluto hat geschrieben:Bauglir ändert, dass Protokoll. Geht erst mit einem normalen Web Server ran und dann wir das Protokoll geändert.

Ja, mein ziel war es alles so simpel wie möglich zu halten, das war auch einer der gründe warum ich die Bauglir nicht benutzen wollte. Die bibliothek ist nur um die 1500 Zeilen groß, und soll auch nur das nötigste können. Somit muss man sich zwar selbst um einiges kümmern, macht die Bibliothek aber auch sehr viel vielseitiger, und zugegeben, viel einfacher in der Entwicklung und Wartung
Da ich letztenendes eh einen Reverse Proxy benutze (wegen let's encrypt zertifikaten) ist das kein problem für mich, und somit kann ich einen Webserver mit FP-Web schreiben und die websocket implementierung separat machen, und hab nicht ein riesen Projekt. Ein standard vernünftig zu unterstützen ist mir schon genug aufwand, da will ich auch nicht noch den HTTP standard implementieren müssen. Außerdem ist fp-web für HTTP bereits schon hervoragend, und ich denke das alles was ich da bauen könnte nur fp-web lite wäre

pluto
Lazarusforum e. V.
Beiträge: 7097
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 »

warf hat geschrieben:Das ist kein Problem in der Bibliothek, sondern wenn sie nicht vernünftig aufgeräumt wird.

OK, teste ich gleich mal aus. Das STRG+C kann ich inzwischen auch abfangen.... in einer anderen Anwendung.

warf hat geschrieben:Das ist übrigens ein reines Linux Problem, windows schließt alle Sockets wenn ein Prozess gekillt wird.

Das ist ja auch Sinnvoller, den jeweiligen Socket gleich zu schließen, wenn die Anwendung sich beendet !

warf hat geschrieben:Ja, mein ziel war es alles so simpel wie möglich zu halten, das war auch einer der gründe warum ich die Bauglir nicht benutzen wollte.

ich fand es sehr angenehm. Erst die WebSite hinzusenden und dann umzuschalten. OK ! vielleicht kann ich deine LIB erweitern um diese Möglichkeit.
Ich hätte die schon ganz gerne....

Was das schließen angeht, habe ich jetzt ein vergleich und kann mir deine LIb genauer ansehen, vielleicht finde ich die Stelle, die sich unterscheidet von der bauglir Lib.

Erst mal vielen Dank, für die neue Erkenntnisse und für die Lib!
MFG
Michael Springwald

Warf
Beiträge: 1527
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von Warf »

pluto hat geschrieben:ich fand es sehr angenehm. Erst die WebSite hinzusenden und dann umzuschalten. OK ! vielleicht kann ich deine LIB erweitern um diese Möglichkeit.
Ich hätte die schon ganz gerne....


Ich hab da halt ne andere Philosophie, lieber viele kleine komponenten und Programme statt der Eierlegenden Wollmilch Sau. Bauglir macht es anders, da provided die bibliothek sehr viel und auch als nutzer musst du relativ wenig beachten (wie gesagt, wie threading gehandhabt wird ist z.b. ganz anders, bei mir musst du als nutzer das threading selber machen, oder zumindest wissen in welchem thread du dich befindest)
Ich benutze es aktuell so, ich habe die Hauptseite die über eine FCL-Web Webmodule anwendung generiert wird und dann meinen websockets server. Das läuft bei mir beides in nem Docker Container (zum einfachen neustarten, etc) auf zwei unterschiedlichen ports. In NGINX habe ich dann konfiguriert das anfragen auf den server generell an die FCL-Web anwendung weitergeleitet werden sollen und anfragen nach /sockets an den websockets server weitergeleitet werden sollen.

Ich will halt auf gar keinen Fall noch den HTTP standard Implementieren müssen, da das wieder ein Projekt für sich ist. Das einzige was ich mir vorstellen kann in Zukunft eventuell zu machen wäre eventuell meinen Ansatz mit FCL-Web zu vereinen, das bei einer websockets anfrage, der handshake ausgeführt wird und der Stream dann an einen Communicator übergeben werden kann. Tatsächlich benutze ich ja intern auch die ssockets unit, die auch von FCL web benutzt wird, also so kompliziert kann es eigentlich nicht sein. Ist aber alles Zukunftsmusik.

pluto
Lazarusforum e. V.
Beiträge: 7097
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 hole noch mal diesen alten Thread raus, weil ich neue Erkenntnisse habe und sie passen aus meiner Sicht ganz gut hier rein.

Ich habe mir in den letzten Tagen, "LazWebsockets" angeschaut und ausprobiert.
Dabei habe ich folgendest beobachtet:
1. Ich starte den WebSocketServer.
2. Ich Öffne die WebSeite im Browser(Egal ob in Chrome oder Firefox)
3. Ich drücke auf Connect
4. Ich beende den Server über exit.

und starte den WebSocketServer neu. in der Regel klappt es ein paar mal und kommt wieder, eine Ähnliche Meldung wie von oben.
Ich habe auch zwischendurch die Verbindung vom Browser aus beendet, dass macht scheinbar kein unterschied.

Ich habe jetzt "Bauglir" angeschaut und bin zu, der Überzeugung gekommen, die Sockts werden nicht richtig geschlossen. Obwohl die Socks freigeben werden
und auch die Verbindungen mit "TTCPBlockSocket.close" geschlossen wird, kommt es bei "Bauglir" immer sehr zuverlässig zu den Fehler,
dass die Verbindungen nicht geschlossen wird.

Ich sehe beim Start, dass erst eine Verbindung aufgemacht wird, wenn ich mich mit einem Browser verbinde sehe ich das 4 Verbindungen aufgemacht werden und
das, sie auch wieder "beendet" werden, jedoch scheinbar NICHT richtig. Diese 4 Verbindungen stehen von Anfang an, auf TIME_WAIT(netstat -net|grep PORT).

Ich habe außerdem noch was beobachtet:
Wenn ich den WebSocktSever Starte(Bauglir), und abwarte, werden die 4 Verbindungen nach Ablauf des TimeOuts geschlossen.
Es macht also kein unterschied, ob ich den WebSocket Server gleich wieder Beende oder erst mal starte.

Dabei sehe ich, dass alle Threads, beendet werden, die vorher aufgemacht werden.

Was ich nicht nachvollziehen kann: Warum werden diese 4 Verbindungen aufgemacht? Die zwei Verbindungen, die richtig aufgebaut werden, können auch wieder geschlossen werden.

Bei NodeJS habe ich dieses Problem z.b. nicht. Aus Spaß habe ich mich damit ein paar Tage befasst(vorher). Dort kann ich den WebSocketServer beliebig oft neu Starten.

Ich glaube, das Problem ist nicht Bauglir oder LazWebsockets, beide Versionen verwenden die Grund Funktionen von FPC. LazWebsockets verwendet
"fpshutdown" und Bauglir verwendet "CloseSocket". Ich hatte das auch getauscht gegen "fpshutdown", macht aber hier kein Unterschied.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7097
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 »

Interessant:
In der Methode "TCustomServer.Execute" in der Datei "CustomServer2", steht "SetLinger(true, 10000);" Wenn ich nun den Wert auf 10 setzte,
kann ich den WebSocketServer scheinbar neu starten ohne Probleme.
MFG
Michael Springwald

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

Re: WebSocket Verbindung wird scheinbar nicht geschlossen !

Beitrag von sstvmaster »

Ich deute SetLinger so: Warte 10s und schliesse dann den Socket.
Windows 10, Lazarus 2.0.12 + Lazarus Trunk
LG Maik

pluto
Lazarusforum e. V.
Beiträge: 7097
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 deute SetLinger so: Warte 10s und schliesse dann den Socket.
So, deute ich es auch. Der Timeout war aber keine 10 Sekunden sondern deutlich länger, ich nehme an pro Socket 10 Sekunden.
Aber darauf muss man erst mal kommen..... dass die Lösung so einfach ist...
MFG
Michael Springwald

Antworten