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