Ein kurzes Zwischenergebnis:
@stevie1401
Soweit ich es sehen konnte verwendet dein Code meine Lib korrekt. Es werden auch keine Threads genutzt, sodass es relativ einfach war dies zu überprüfen.
Ich glaube der Fehler liegt entweder in meiner Lib, bei PureBasic oder irgendwo dazwischen. Dazwischen würde bedeuten, dass ich die Netzwerkbefehle missverstehe, oder die Dokumentation fehlerhaft/unvollständig ist.
Ich hab jetzt ne kleine Testumgebung geschaffen, in der ich den Server mit Verbindungen und Verbindungsabbrüchen befeuere. Damit bekomme ich einen Crash alle paar Minuten bis halbe Stunde. Mit "Server" meine ich den reinen Websocket server, und das ohne Auswertung von Events.
Erkenntnisse:
- Abstürze werden nur selten vom Debugger abgefangen, also das Executable beendet sich einfach so (Das ist unter Win 10, unter linux wird es wahscheinlich so wie bei dir abgefangen)
- Wenn sie abgefangen werden, dann immer bei irgendwelchen Netzwerkbefehlen
- Soweit ich sehen konnte gibt es keine Regelmäßigkeit (z.B. Crash nach Senden von x, Crash nach empfangen vom HTTP header)
- Nach mehreren versuchen klappt der Versuchsaufbau nicht mehr, verbindungen werden nicht mehr korrekt oder nur noch langsam aufgebaut. Selbst neustarten des WebSocket-Servers hilft nicht. Irgendwann ist der Port einfach belegt, obwohl kein Programm auf ihm "lauscht".
Was mir dabei aufgefallen ist:
Nach ein paar tests, und mehrmaligem Prüfen von eventuell kritischen Stellen, hab ich mal versucht CloseNetworkConnection auszuklammern. Das ist die einzige Netzwerkfunktion, welche in einem anderen Thread ausgeführt wird. Und die soll nur dazu dienen bei manuellen oder durch den Client gewünschten verbindungsabbrüchen dies dem client mitzuteilen. Komischerweise läuft es jetzt seit über einer Stunde rund.
Dabei wird in der dokumentation nicht beschrieben, dass CloseNetworkConnection() nicht in einem anderen Thread ausgeführt werden darf. Und außer, dass es in einem anderen Thread aufgerufen wird, wüsste ich nicht was der Auslöser sein könnte. Dabei stelle ich sogar sicher, dass die client id, welche CloseNetworkConnection übergeben wird, gültig ist. Auch wird CloseNetworkConnection nicht aufgerufen, wenn ein client bereits durch #PB_NetworkEvent_Disconnect als getrennt signalisiert wurde.
Ich könnte noch testen ob das Problem noch besteht, wenn ich den client per CloseNetworkConnection im Hauptthread schließe, aber wenn es jetzt so funktioniert, dann belasse ich es erstmal.
Also die Lösung ist erstmal CloseNetworkConnection in der Lib auszukommentieren (Gibt nur eine Zeile). Wenn meine Tests hier noch weiter durchlaufen, werde ich das auch in der offiziellen Version ändern. Der Nachteil ohne CloseNetworkConnection ist nur, dass das manuelle trennen der Verbindung dem Client nicht signalisiert wird. Und natürlich wird die Verbindung nicht geschlossen, solange der client die nicht schließt.