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: 102
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

Wie vorhin angekündigt ist hier die Version ohne Threads: WebSocket_Server/threadless

Dafür musst du quasi nur zwei Zeilen in deinem Code ändern.
Deine Hauptschleife:

Code: Alles auswählen

Repeat
  ; Other stuff
  WebSocket_Server::Worker(*Server)
  ; Other stuff
ForEver
Das Erstellen des Servers:

Code: Alles auswählen

*Server = WebSocket_Server::Create(80, @DeineEventFunktion())
stevie1401
Beiträge: 614
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Ja Mensch, da bin ich ja mal gespannt :)
Ab heute läuft der threadlose Code.
Ich werde berichten.
Vielen lieben Dank!!!
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1
stevie1401
Beiträge: 614
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Zwischenbericht nach 4 Wochen:
Der Server läuft teilweise mit sehr vielen Clients und es gab bis jetzt keinerlei Probleme :)

Vielen, vielen Dank, Dadido3! :)
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1
stevie1401
Beiträge: 614
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Ich habe inzwischen die Client() - Liste herausgenommen und durch einfaches Dimensionieren von Variablen ersetzt.

Code: Alles auswählen

Dim Client_Name.s(x)
Dim Cliend_Id(x)
Das Programm beendete sich manchmal, wenn es in der IDE lief ohne dass es die IDE bemerkte.
Ich habe auch nicht herausfinden können, woran es lag.
Seitdem die Liste raus ist, ist es bis jetzt nicht mehr passiert.
Kann es am Pointer *client liegen?

Mir ist zudem aufgefallen, dass das Serverprogramm ab und zu ein #Event_Disconnect empfängt, obwohl der Browser des Clients nicht geschlossen wurde und die Verbindung auch nicht anders unterbrochen wurde.
Woran kann das liegen?
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1
Benutzeravatar
Dadido3
Beiträge: 102
Registriert: 24.02.2007 22:15
Kontaktdaten:

Re: WebSocket Server

Beitrag von Dadido3 »

stevie1401 hat geschrieben: 27.07.2021 08:17 Ich habe auch nicht herausfinden können, woran es lag.
Seitdem die Liste raus ist, ist es bis jetzt nicht mehr passiert.
Das deutet darauf hin, dass irgendwo in "fremde" Speicherbereiche geschrieben wurde, und somit unbeabsichtigt irgendwelche Werte überschrieben wurden (Memory corruption). Das kann passieren, wenn du z.B. auf ein Listenelement zugreifst, welches zuvor per DeleteElement gelöscht wurde. Oder wenn du per ChangeCurrentElement die aktuelle Listenposition auf ein nicht (mehr) gültiges Listenelement setzt. Auch kann es zu Problemen kommen, wenn mehrere Threads auf die selbe Liste zugreifen. (Was bei dir aber nicht der fall sein kann, da du keine Threads verwendest)

Der Beispielcode zeigt wie man die Liste mit verbundenen Clients verwaltet. Ich kann leider nicht sagen, warum es bei dir mit der verketteten Liste abstürzt. Wenn es aber bei dir mit einem einfachen Array funktioniert, dann lass es so. Du musst aber das Array vergrößern, wenn der Platz zu knapp wird.
stevie1401 hat geschrieben: 27.07.2021 08:17 Kann es am Pointer *client liegen?
Die *Client Zeiger sind immer solange gültig, bis du ein #Event_Disconnect empfängst (Exakt nach dem Verlassen der event handler Funktion wird der Zeiger ungültig). Danach darfst du den *Client Zeiger nicht mehr verwenden. Es spielt keine Rolle wie du deine Clients verwaltest (Als verlinkte Liste, als Array oder als map), solange du keinen ungültig gewordenen *Client verwendest.
stevie1401 hat geschrieben: 27.07.2021 08:17 Mir ist zudem aufgefallen, dass das Serverprogramm ab und zu ein #Event_Disconnect empfängt, obwohl der Browser des Clients nicht geschlossen wurde und die Verbindung auch nicht anders unterbrochen wurde.
Woran kann das liegen?
Entweder bricht der Browser die Verbindung aus irgendeinem Grund ab, oder mein Server erzwingt das Schließen der Verbindung weil ein Client bestimmte Grenzen überschritten hat. Es gibt im Moment leider keine Möglichkeit den Grund abzufragen.

Im Code der Library sind ein paar stellen, die preisgeben warum ein Client getrennt wurde:

Code: Alles auswählen

Client_Disconnect_Mutexless(*Object, *Client, #CloseStatusCode_ProtocolError) ; Server hat eine Unstimmigkeit in den vom Client gesendeten Daten gefunden.
Client_Disconnect_Mutexless(*Object, *Client, #CloseStatusCode_SizeLimit) ; Ein client hat die gültige frame size überschritten.
Auch wäre diese Stelle noch interessant für dich:

Code: Alles auswählen

statusCode = ((statusCode & $FF00) >> 8) | ((statusCode & $FF) << 8)
reason = PeekS(Event_Frame\Payload + 2, Event_Frame\Payload_Size - 2, #PB_UTF8 | #PB_ByteLength)
Das ist der statusCode und reason (als lesbarer text), wenn ein Client einen Verbindungsabbruch einleitet. Einfach mal per debug (oder sonstwie) ausgeben.

Mögliche statusCodes:

Code: Alles auswählen

Enumeration
    #CloseStatusCode_Normal = 1000      ; indicates a normal closure, meaning that the purpose for which the connection was established has been fulfilled.
    #CloseStatusCode_GoingAway          ; indicates that an endpoint is "going away", such as a server going down or a browser having navigated away from a page.
    #CloseStatusCode_ProtocolError      ; indicates that an endpoint is terminating the connection due to a protocol error.
    #CloseStatusCode_UnhandledDataType  ; indicates that an endpoint is terminating the connection because it has received a type of data it cannot accept (e.g., an endpoint that understands only text data MAY send this if it receives a binary message).
    #CloseStatusCode_1004               ; Reserved.  The specific meaning might be defined in the future.
    #CloseStatusCode_NoStatusCode       ; is a reserved value and MUST NOT be set as a status code in a Close control frame by an endpoint.  It is designated for use in applications expecting a status code to indicate that no status code was actually present.
    #CloseStatusCode_AbnormalClose      ; is a reserved value and MUST NOT be set as a status code in a Close control frame by an endpoint.  It is designated for use in applications expecting a status code to indicate that the connection was closed abnormally, e.g., without sending or receiving a Close control frame.
    #CloseStatusCode_1007               ; indicates that an endpoint is terminating the connection because it has received data within a message that was not consistent with the type of the message (e.g., non-UTF-8 [RFC3629] data within a text message).
    #CloseStatusCode_PolicyViolation    ; indicates that an endpoint is terminating the connection because it has received a message that violates its policy.  This is a generic status code that can be returned when there is no other more suitable status code (e.g., 1003 or 1009) or if there is a need to hide specific details about the policy.
    #CloseStatusCode_SizeLimit          ; indicates that an endpoint is terminating the connection because it has received a message that is too big for it to process.
EndEnumeration
stevie1401
Beiträge: 614
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: WebSocket Server

Beitrag von stevie1401 »

Alles klar!
Vielen Dank für deine Hilfe und Unterstützung!
Ohne dich würde mein Projekt nicht laufen! :)

Stevie
Ich programmiere plattformunabhängig und suche immer Lösungen für alle Plattformen.
Win 7/10, Linux Mint Cindy 3 (Debian), Mint 18.3 / 19.1
Antworten