123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #pragma once
- #include <functional>
- #include <Thread.h>
- #include <Critical.h>
- #include <Random.h>
- #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;
- };
- }
- }
|