WebSocket.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #pragma once
  2. #include <functional>
  3. #include <Thread.h>
  4. #include <Critical.h>
  5. #include <Random.h>
  6. #include "Klient.h"
  7. namespace Network
  8. {
  9. namespace WebSocket
  10. {
  11. struct Frame
  12. {
  13. bool fin, rsv1, rsv2, rsv3; // bit 0 bis 3
  14. char opcode; // bit 4 bis 7
  15. bool mask; // bit 8
  16. __int64 dataLength; // bit 9 bis 15 oder bis 31 oder bis 79
  17. unsigned char key[ 4 ]; // wenn mask = 1 dann die nächsten 32 bits
  18. char *data; // die daten
  19. // baut frames zusammen welche zu einer nachricht gehören
  20. __declspec( dllexport ) Frame &operator+=( const Frame &b );
  21. };
  22. enum DataType
  23. {
  24. TEXT,
  25. BINARY
  26. };
  27. class WebSocketClient : public Framework::Thread
  28. {
  29. private:
  30. std::function< void( WebSocketClient *, __int64 size, const char *data, DataType typ ) > callback;
  31. Klient *klient;
  32. Framework::Text path;
  33. Framework::Text host;
  34. Frame *lastPingFrame;
  35. Array< Frame > *queue;
  36. unsigned short port;
  37. Critical c;
  38. Critical c2;
  39. RandomGenerator gen;
  40. bool nextClose;
  41. public:
  42. // Erstellt ein neues Websocket
  43. // path: Der Pfad zur Resource
  44. // host: Die Adresse des Servers
  45. // port: Der Port des Servers
  46. __declspec( dllexport ) WebSocketClient( const char *path, const char *host, unsigned short port );
  47. __declspec( dllexport ) virtual ~WebSocketClient();
  48. // Setzt die Funktion, welche zum verarbeiten von Servernachrichten aufgerufen werden soll
  49. __declspec( dllexport ) void setMessageCallback( std::function< void( WebSocketClient *, __int64 size, const char *data, DataType typ ) > callback );
  50. // Führt den WebSocket Handshake aus falls noch nicht verbunden
  51. __declspec( dllexport ) bool connect();
  52. // Sendet eine Nachricht an den Server
  53. // size: Die länge der Nachricht
  54. // data: Die Daten
  55. // typ: Den Typ der Nachricht
  56. __declspec( dllexport ) bool send( __int64 size, const char *data, DataType typ = TEXT );
  57. // Diese Funktion verarbeitet Servernachrichten. Sie sollte nicht manuell aufgerufen werden, da sie automatisch gestartet wird
  58. __declspec( dllexport ) void thread() override;
  59. // bricht die verbindung ab
  60. __declspec( dllexport ) void disconnect();
  61. // Gibt 1 zurück, wenn eine Verbindung zum Server besteht, 0 sonnst
  62. __declspec( dllexport ) bool isConnected() const;
  63. // löscht das objekt wenn es nicht mehr gebraucht wird und beendet den Thread
  64. __declspec( dllexport ) Framework::Thread *release() override;
  65. };
  66. }
  67. }