#pragma once #include #include #include #include #include "Klient.h" namespace Network { namespace WebSocket { struct Frame { bool fin, rsv1, rsv2, rsv3; // bit 0 bis 3 char opcode; // bit 4 bis 7 bool mask; // bit 8 __int64 dataLength; // bit 9 bis 15 oder bis 31 oder bis 79 unsigned char key[ 4 ]; // wenn mask = 1 dann die nächsten 32 bits char *data; // die daten // baut frames zusammen welche zu einer nachricht gehören __declspec( dllexport ) Frame &operator+=( const Frame &b ); }; enum DataType { TEXT, BINARY }; class WebSocketClient : public Framework::Thread { private: std::function< void( WebSocketClient *, __int64 size, const char *data, DataType typ ) > callback; Klient *klient; Framework::Text path; Framework::Text host; Frame *lastPingFrame; Array< Frame > *queue; unsigned short port; Critical c; Critical c2; RandomGenerator gen; bool nextClose; public: // Erstellt ein neues Websocket // path: Der Pfad zur Resource // host: Die Adresse des Servers // port: Der Port des Servers __declspec( dllexport ) WebSocketClient( const char *path, const char *host, unsigned short port ); __declspec( dllexport ) virtual ~WebSocketClient(); // Setzt die Funktion, welche zum verarbeiten von Servernachrichten aufgerufen werden soll __declspec( dllexport ) void setMessageCallback( std::function< void( WebSocketClient *, __int64 size, const char *data, DataType typ ) > callback ); // Führt den WebSocket Handshake aus falls noch nicht verbunden __declspec( dllexport ) bool connect(); // Sendet eine Nachricht an den Server // size: Die länge der Nachricht // data: Die Daten // typ: Den Typ der Nachricht __declspec( dllexport ) bool send( __int64 size, const char *data, DataType typ = TEXT ); // Diese Funktion verarbeitet Servernachrichten. Sie sollte nicht manuell aufgerufen werden, da sie automatisch gestartet wird __declspec( dllexport ) void thread() override; // bricht die verbindung ab __declspec( dllexport ) void disconnect(); // Gibt 1 zurück, wenn eine Verbindung zum Server besteht, 0 sonnst __declspec( dllexport ) bool isConnected() const; // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread __declspec( dllexport ) Framework::Thread *release() override; }; } }