WebSocket Server

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

Ich habe mal ein paar Sachen behoben, verbessert und aufgeräumt. Dabei war nichts wo ich sicher wäre, dass es deinen Absturz verursacht, aber einen Versuch ist es trotzdem wert.

Es gab in alten Version ein Speicherleck beim Lesen des HTTP Headers, je nach größe des gesendeten Headers wurden so vielfache von 2048 Bytes nicht wieder freigegeben. Außerdem werden jetzt alle Speicherallokationen überprüft, damit ist auch eine Fehlerquelle (Für seltsame Fehler wo der Debugger keine hilfreichen Informationen mehr rausrückt) beseitigt. Daneben hab ich noch eine mögliche Race condition und eine möglichkeit Deadlocks zu erzeugen behoben, aber die sind bei dir eher nicht aufgetreten und hätten sich anders geäußert.

https://github.com/Dadido3/WebSocket_Server/releases
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Du bist super!!!
Gleich mal testen :)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Ach was mir einfällt:
Ich arbeite ja nicht mit Threads. Ich benutze dein "Polling".

Also:

Code: Alles auswählen


 repeat
  While WebSocket_Server::Event_Callback(*Server, @WebSocket_Event())
  Wend
  delay(10)
 forever
 
Können da vielleicht die "Fehler" entstehen?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

Das mit dem Polling ist schon korrekt. Auf die Weise wird eben sichergestellt, dass das Event-Callback in dem selben Thread läuft wie dein anderer Code. Und dadurch musst du dich nicht mit Threads herumschlagen. Eventuell könnte noch ein Fehler bei dir in der Handhabung der Events sein, aber ich hatte ja letztes mal schon Quer über den Code geschaut, und mir ist nichts aufgefallen.

Trotzdem, kannst du mir nochmal sagen, welche Zeilennummer genau den Fehler verursacht hat (Oder mir die umliegenden Zeilen drumherum nennen).
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Zeile 811

Code: Alles auswählen

  ForEach *Object\Client() ; TODO: Don't iterate through all objects, but use a queue. Elements last in this list can be underprivileged in some cases
Da meckert die Ide, ich weiss nicht mehr genau welche Meldung, entweder Speicherfehler oder Objekt gibt es nicht.
Aber wie schon gesagt, sehr sehr selten.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

Ok,
  • *Object existiert auf jeden Fall, außer du rufst eine Serverfunktion auf nachdem der Server von dir geschlossen wurde. Das ist aber hier nicht der fall.
  • Genauso existiert die Liste *Object\Client() bis der Server vom Benutzer beendet wird.
  • Die Objekte innerhalb der Liste oder die Listenposition werden/wird nicht gleichzeitig an anderer Stelle geändert, es ist durch einen Mutex abgesichert.
Wahrscheinlich passiert irgendo vorher ein illegaler Speicherzugriff und das was der Debugger zurück gibt ist nur die Spätfolge davon. Sag bescheid wenn es wieder Probleme gibt, eventuell auch mal auf den Speicherverbrauch achten, ob der mit der Zeit immer mehr ansteigt.

Eventuell kann ich ja nochmal nen Blick über den kompletten Code werfen, wenn es dir nichts ausmacht.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Alles klar.
Ich baue meinen Serverprogramm gerade um, wenn ich fertig bin, kann ich dir gerne den Code geben.
Ich kann aber jetzt schon sagen, dass ich niemals einen Client absichtlich beende, sondern immer nur auf beendete Clients reagiere.
Erst einmal besten Dank für alles!
Ich melde mich!
:)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

Ich habe das Modul mal mit Hilfe der Autobahn|Testsuite testen lassen. Dabei habe ich noch einige sachen behoben, das betrifft aber eher die Konformität mit dem WebSocket Standard. Außerdem unterstützt der Server nun das Zusammenfassen von fragmentierten Frames, was aber optional ist (opt-out) falls der Nutzer des Moduls bzw. die Applikation das nicht bereits übernimmt.

Damit, und mit ein paar anderen Änderungen ist der Server nun wirklich kompatibel mit dem WebSocket standard. Das heisst nicht, dass er nun alles unterstützt. Zum Beispiel gibt es keine Datenkompression und WebSocket extensions werden auch nicht unterstützt. Aber er sollte jetzt mit allen Client-Implementationen zusammenarbeiten, da eh nur die Features ausgehandelt werden, welche von beiden Seiten supportet werden.

Die aktuell(st)e Version ist >hier< zu finden.

@stevie1401

Du kannst ja erstmal noch mit der alten Version (v1.003) weiter testen. Falls du dann nach einiger Zeit mit ziemlicher Sicherheit sagen kannst, dass es keine Probleme mehr gibt, kannst du, wenn du willst, auf die neue Version wechseln.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Ich habe deinen Text leider erst eben gelesen, denn ich wollte gerade etwas zur Version 1003 schreiben:

Heute ist mein Purebasic-Webserver erneut 2x kurz hintereinander wortlos abgestürzt.
Er lief in der Linux IDE, die es wieder nicht bemerkte.
Es waren ca 80 Clients dran und da der "laufende Betrieb" reibungslos läuft, vermute ich inzwischen, dass es mit der Anmeldung an den Server oder mit der Abmeldung vom Server zu tun haben muss.
Vielleicht ein "unüblicher" Browser?
Kann man sich vor diesem "schützen" bzw. dafür sorgen, dass sich dieser gar nicht erst anmeldet?
Ab morgen läuft der Server eine Zeit lang in einer Windows IDE. Vielleicht gibt das mehr Information.

Ich teste jetzt mal die 1004-Version. Unter Windows. Kann ja sein, dass die Linux IDE auch etwas fehlerhaft ist und nicht alle Fehler erkennen kann.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Dadido3
Beiträge: 103
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

Ich bin leider etwas ratlos.

Ich habe die letzten Tage einen Test-client geschrieben, welcher den Server mit Nachrichten und Verbindungsanfragen bomardiert. Auch habe ich den Server dahin optimiert, sodass er in der Lage ist viel mehr Anfragen und Pakete zu verarbeiten.

Gestern hatte ich es dann geschafft mit dem Testaufbau nach ungefähr einer halben Stunde einen "Speicheroverflow" zu provozieren. Leider hat sich dann heute rausgestellt, dass es sehr wahrscheinlich ein Bug in PureBasic ist (In Kombination von Purifier + ReAllocateMemory + Multithreading). "Leider" deshalb, weil der Bug meiner Meinung nach zu keinem Absturz führt, und nur Fehlmeldungen des Purifiers verursacht. Somit ist der Fehler immer noch nicht behoben.
stevie1401 hat geschrieben:Vielleicht ein "unüblicher" Browser?
Wenn du rausfinden könntest, ob da irgendwo ein Zusammenhang besteht, könnte ich eventuell in diese Richtung weitersuchen. Dazu könntest du in eine Logdatei schreiben, wer sich wann verbindet und wer wann die Verbindung trennt. Aber ich glaube nicht, dass es an einem Client liegt.
stevie1401 hat geschrieben:Kann man sich vor diesem "schützen" bzw. dafür sorgen, dass sich dieser gar nicht erst anmeldet?
Im Idealfall gibt es keinen Browser oder Client, welcher Abstürze verursacht. Und falls doch, dann würde ich eher das grundlegende Problem beheben.
stevie1401 hat geschrieben:Kann ja sein, dass die Linux IDE auch etwas fehlerhaft ist und nicht alle Fehler erkennen kann.
Die IDE und der Debugger von PureBasic sind generell etwas überfordert (bzw. komplett unbrauchbar), wenn Multithreading im Spiel ist. Ich glaube ich werde für dich eine Version erstellen, welche komplett auf Threading verzichtet. Das kann im schlimmsten Fall dafür sorgen, dass das Problem verschwindet. Und im besten Fall liefert der Debugger endlich mal korrekte Fehlermeldungen, die weiterhelfen. Letzterer Fall wäre mir am liebsten, da ich dann das Problem eingrenzen kann (Egal, ob das Problem letztendlich in meinem Code liegt, oder in PureBasic).

Ich erstelle heute abend noch die komplett "threadlose" Version vom Server. Wäre schön, wenn du die dann nächstmöglichst verwendest, und den Server dann wie jetzt auch im Debugger laufen lässt. Ich verlinke die dann hier.
Antworten