Browse Source

use framework logging

Kolja Strohm 3 months ago
parent
commit
7217587072
10 changed files with 1043 additions and 931 deletions
  1. 138 137
      Network/HttpRequest.cpp
  2. 42 37
      Network/HttpRequest.h
  3. 19 18
      Network/Klient.cpp
  4. 97 70
      Network/Klient.h
  5. 92 98
      Network/Network.cpp
  6. 120 111
      Network/Network.h
  7. 2 0
      Network/Network.vcxproj
  8. 27 26
      Network/Server.cpp
  9. 436 375
      Network/WebSocket.cpp
  10. 70 59
      Network/WebSocket.h

+ 138 - 137
Network/HttpRequest.cpp

@@ -1,178 +1,179 @@
 #include "HttpRequest.h"
-#include "Klient.h"
-#include <Zeit.h>
+
 #include <iostream>
+#include <Zeit.h>
+
+#include "Klient.h"
 
 using namespace Framework;
 using namespace Network;
 using namespace HTTP;
 
-
-PostRequest::PostRequest(const char* path, const char* host, const char* data, const char* contentType, unsigned short port, bool useSSL)
-	: ReferenceCounter()
+PostRequest::PostRequest(const char* path,
+    const char* host,
+    const char* data,
+    const char* contentType,
+    unsigned short port,
+    bool useSSL)
+    : ReferenceCounter()
 {
-	this->path = path;
-	this->host = host;
-	this->data = data;
-	this->contentType = contentType;
-	this->port = port;
-	this->useSSL = useSSL;
+    this->path = path;
+    this->host = host;
+    this->data = data;
+    this->contentType = contentType;
+    this->port = port;
+    this->useSSL = useSSL;
 }
 
 Answer* PostRequest::execute() const
 {
-	Text message = "POST ";
-	message += path;
-	message += " HTTP/1.1\r\n";
-	message += "Host: ";
-	message += host;
-	message += "\r\nContent-Type: ";
-	message += contentType;
-	message += "; charset=latin-1\r\nContent-Length: ";
-	message += data.getLength();
-	message += "\r\n\r\n";
-	message += data;
-	SSLKlient httpsK;
-	Klient httpK;
-	if (useSSL)
-	{
-		if (!httpsK.verbinde(port, host))
-			return 0;
-		httpsK.sende(message, message.getLength());
-	}
-	else
-	{
-		if (!httpK.verbinde(port, host))
-			return 0;
-		httpK.sende(message, message.getLength());
-	}
-	int length = -1;
-	bool lastn = 0;
-	Text answer;
-	do
-	{
-		char buff[2];
-		buff[1] = 0;
-		if ((useSSL && httpsK.getNachricht(buff, 1)) || (!useSSL && httpK.getNachricht(buff, 1)))
-		{
-			answer += buff;
-			if (buff[0] == '\n')
-			{
-				if (length <= 0)
-				{
-					int p = answer.positionVon("Content-Length: ");
-					if (p >= 0)
-					{
-						p += 16;
-						Text* len = answer.getTeilText(p);
-						len->remove(len->positionVon("\n"), len->getLength());
-						len->remove("\r");
-						length = (int)*len;
-						len->release();
-					}
-				}
-				else if (lastn)
-				{ // header der antwort ist vorbei
-					char* buff = new char[length + 1];
-					buff[length] = 0;
-					if (length > 0)
-					{
-						if (useSSL)
-							httpsK.getNachricht(buff, length);
-						else
-							httpK.getNachricht(buff, length);
-					}
-					answer += buff;
-					delete[] buff;
-					break;
-				}
-				lastn = 1;
-			}
-			else if (buff[0] != '\r')
-				lastn = 0;
-		}
-		else
-			break;
-	} while ((useSSL && httpsK.hatNachricht(1000)) || (!useSSL && httpK.hatNachricht(1000)));
-	if (answer.getLength())
-		return new Answer(answer);
-	return 0;
+    Text message = "POST ";
+    message += path;
+    message += " HTTP/1.1\r\n";
+    message += "Host: ";
+    message += host;
+    message += "\r\nContent-Type: ";
+    message += contentType;
+    message += "; charset=latin-1\r\nContent-Length: ";
+    message += data.getLength();
+    message += "\r\n\r\n";
+    message += data;
+    SSLKlient httpsK;
+    Klient httpK;
+    if (useSSL)
+    {
+        if (!httpsK.verbinde(port, host)) return 0;
+        httpsK.sende(message, message.getLength());
+    }
+    else
+    {
+        if (!httpK.verbinde(port, host)) return 0;
+        httpK.sende(message, message.getLength());
+    }
+    int length = -1;
+    bool lastn = 0;
+    Text answer;
+    do
+    {
+        char buff[2];
+        buff[1] = 0;
+        if ((useSSL && httpsK.getNachricht(buff, 1))
+            || (!useSSL && httpK.getNachricht(buff, 1)))
+        {
+            answer += buff;
+            if (buff[0] == '\n')
+            {
+                if (length <= 0)
+                {
+                    int p = answer.positionVon("Content-Length: ");
+                    if (p >= 0)
+                    {
+                        p += 16;
+                        Text* len = answer.getTeilText(p);
+                        len->remove(len->positionVon("\n"), len->getLength());
+                        len->remove("\r");
+                        length = (int)*len;
+                        len->release();
+                    }
+                }
+                else if (lastn)
+                { // header der antwort ist vorbei
+                    char* buff = new char[length + 1];
+                    buff[length] = 0;
+                    if (length > 0)
+                    {
+                        if (useSSL)
+                            httpsK.getNachricht(buff, length);
+                        else
+                            httpK.getNachricht(buff, length);
+                    }
+                    answer += buff;
+                    delete[] buff;
+                    break;
+                }
+                lastn = 1;
+            }
+            else if (buff[0] != '\r')
+                lastn = 0;
+        }
+        else
+            break;
+    } while ((useSSL && httpsK.hatNachricht(1000))
+             || (!useSSL && httpK.hatNachricht(1000)));
+    if (answer.getLength()) return new Answer(answer);
+    return 0;
 }
 
-
 Answer::Answer(const char* answer)
-	: ReferenceCounter()
+    : ReferenceCounter()
 {
-	all = answer;
-	TextReader reader(new Text(answer));
-	// parse header
-	Text* line = reader.leseZeile();
-	line->remove("\r\n");
-	line->remove("\n");
-	header += *line;
-	header += "\n";
-	int trenn = line->positionVon(" ");
-	Text* tmp = line->getTeilText(0, trenn);
-	this->protocol = *tmp;
-	tmp->release();
-	line->remove(0, trenn + 1);
-	trenn = line->positionVon(" ");
-	tmp = line->getTeilText(0, trenn);
-	this->statusNumber = (int)*tmp;
-	tmp->release();
-	line->remove(0, trenn + 1);
-	this->statusText = *line;
-	line->release();
-	while (!reader.istEnde())
-	{
-		Text* line = reader.leseZeile();
-		line->remove("\r\n");
-		line->remove("\n");
-		if (line->getLength() > 0)
-		{
-			header += *line;
-			header += "\n";
-		}
-		if (line->positionVon("Date:") == 0)
-			this->date = line->getText() + 6;
-		if (line->positionVon("Content-Type:") == 0)
-			this->contentType = line->getText() + 14;
-		int len = line->getLength();
-		line->release();
-		if (len == 0)
-			break;
-	}
-	// parse body
-	if (!reader.istEnde())
-		this->data = answer + reader.getLPosition();
+    all = answer;
+    TextReader reader(new Text(answer));
+    // parse header
+    Text* line = reader.leseZeile();
+    line->remove("\r\n");
+    line->remove("\n");
+    header += *line;
+    header += "\n";
+    int trenn = line->positionVon(" ");
+    Text* tmp = line->getTeilText(0, trenn);
+    this->protocol = *tmp;
+    tmp->release();
+    line->remove(0, trenn + 1);
+    trenn = line->positionVon(" ");
+    tmp = line->getTeilText(0, trenn);
+    this->statusNumber = (int)*tmp;
+    tmp->release();
+    line->remove(0, trenn + 1);
+    this->statusText = *line;
+    line->release();
+    while (!reader.istEnde())
+    {
+        Text* line = reader.leseZeile();
+        line->remove("\r\n");
+        line->remove("\n");
+        if (line->getLength() > 0)
+        {
+            header += *line;
+            header += "\n";
+        }
+        if (line->positionVon("Date:") == 0) this->date = line->getText() + 6;
+        if (line->positionVon("Content-Type:") == 0)
+            this->contentType = line->getText() + 14;
+        int len = line->getLength();
+        line->release();
+        if (len == 0) break;
+    }
+    // parse body
+    if (!reader.istEnde()) this->data = answer + reader.getLPosition();
 }
 
 const char* Answer::getContentType() const
 {
-	return contentType;
+    return contentType;
 }
 
 const char* Answer::getData() const
 {
-	return data;
+    return data;
 }
 
 int Answer::getStatusCode() const
 {
-	return statusNumber;
+    return statusNumber;
 }
 
 const char* Answer::getStatusText() const
 {
-	return statusText;
+    return statusText;
 }
 
 const char* Answer::getDate() const
 {
-	return date;
+    return date;
 }
 
 const char* Answer::getAll() const
 {
-	return all;
+    return all;
 }

+ 42 - 37
Network/HttpRequest.h

@@ -4,44 +4,49 @@
 
 namespace Network
 {
-	namespace HTTP
-	{
-		class Answer : public virtual Framework::ReferenceCounter
-		{
-		private:
-			Framework::Text protocol;
-			int statusNumber;
-			Framework::Text statusText;
-			Framework::Text date;
-			Framework::Text contentType;
-			Framework::Text header;
-			Framework::Text data;
-			Framework::Text all;
+    namespace HTTP
+    {
+        class Answer : public virtual Framework::ReferenceCounter
+        {
+        private:
+            Framework::Text protocol;
+            int statusNumber;
+            Framework::Text statusText;
+            Framework::Text date;
+            Framework::Text contentType;
+            Framework::Text header;
+            Framework::Text data;
+            Framework::Text all;
 
-		public:
-			__declspec(dllexport) Answer(const char* answer);
-			__declspec(dllexport) const char* getContentType() const;
-			__declspec(dllexport) const char* getData() const;
-			__declspec(dllexport) int getStatusCode() const;
-			__declspec(dllexport) const char* getStatusText() const;
-			__declspec(dllexport) const char* getDate() const;
-			__declspec(dllexport) const char* getAll() const;
-		};
+        public:
+            __declspec(dllexport) Answer(const char* answer);
+            __declspec(dllexport) const char* getContentType() const;
+            __declspec(dllexport) const char* getData() const;
+            __declspec(dllexport) int getStatusCode() const;
+            __declspec(dllexport) const char* getStatusText() const;
+            __declspec(dllexport) const char* getDate() const;
+            __declspec(dllexport) const char* getAll() const;
+        };
 
-		class PostRequest : public virtual Framework::ReferenceCounter
-		{
-		private:
-			Framework::Text path;
-			Framework::Text host;
-			Framework::Text contentType;
-			Framework::Text data;
-			unsigned short port;
-			bool useSSL;
+        class PostRequest : public virtual Framework::ReferenceCounter
+        {
+        private:
+            Framework::Text path;
+            Framework::Text host;
+            Framework::Text contentType;
+            Framework::Text data;
+            unsigned short port;
+            bool useSSL;
 
-		public:
-			__declspec(dllexport) PostRequest(const char* path, const char* host, const char* data, const char* contentType, unsigned short port, bool useSSL = false);
+        public:
+            __declspec(dllexport) PostRequest(const char* path,
+                const char* host,
+                const char* data,
+                const char* contentType,
+                unsigned short port,
+                bool useSSL = false);
 
-			__declspec(dllexport) Answer* execute() const;
-		};
-	}
-}
+            __declspec(dllexport) Answer* execute() const;
+        };
+    } // namespace HTTP
+} // namespace Network

+ 19 - 18
Network/Klient.cpp

@@ -8,6 +8,7 @@
 #endif
 #include <Datei.h>
 #include <Key.h>
+#include <Logging.h>
 
 using namespace Network;
 
@@ -101,8 +102,8 @@ bool Klient::sende(const char* nachricht, int len) // sendet zum Server
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "send: " << l << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "send: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
             errorOccured = 1;
@@ -125,8 +126,8 @@ bool Klient::getNachricht(char* nachricht, int len) // empf
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "recv: " << l << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "recv: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
             errorOccured = 1;
@@ -157,8 +158,8 @@ bool Klient::sendeEncrypted(const char* nachricht, int len) // sendet zum Server
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "send: " << l << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "send: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
             n->release();
@@ -185,8 +186,8 @@ bool Klient::getNachrichtEncrypted(
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "recv: " << l << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "recv: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
             errorOccured = 1;
@@ -244,8 +245,8 @@ bool Klient::hatNachricht(int zeit) // Wartet eine Zeit Lang auf eine Nachricht
     {
 #ifdef WIN32
 #    ifdef _DEBUG
-        std::cout << "select: " << result << " Error: " << WSAGetLastError()
-                  << std::endl;
+        Framework::Logging::warning()
+            << "select: " << result << " Error: " << WSAGetLastError();
 #    endif
 #endif
     }
@@ -278,8 +279,8 @@ bool Klient::waitForNextMessage() const // wartet bis es etwas zu empfangen gibt
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "select: " << rv << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "select: " << rv << " Error: " << WSAGetLastError();
 #    endif
 #endif
             return 0;
@@ -296,8 +297,8 @@ bool Klient::waitForNextMessage() const // wartet bis es etwas zu empfangen gibt
     {
 #ifdef WIN32
 #    ifdef _DEBUG
-        std::cout << "recv: " << l << " Error: " << WSAGetLastError()
-                  << std::endl;
+        Framework::Logging::warning()
+            << "recv: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
         return 0; // Fehler
@@ -364,8 +365,8 @@ bool SSLKlient::sende(const char* nachricht, int len) // sendet zum Server
         if (l <= 0)
         {
 #ifdef _DEBUG
-            std::cout << "SSL_write: " << l
-                      << " Error: " << SSL_get_error(ssl, l) << std::endl;
+            Framework::Logging::warning()
+                << "SSL_write: " << l << " Error: " << SSL_get_error(ssl, l);
 #endif
             return 0; // Fehler
         }
@@ -386,8 +387,8 @@ bool SSLKlient::getNachricht(char* nachricht, int len) // empf
         if (l <= 0)
         {
 #ifdef _DEBUG
-            std::cout << "SSL_read: " << l
-                      << " Error: " << SSL_get_error(ssl, l) << std::endl;
+            Framework::Logging::warning()
+                << "SSL_read: " << l << " Error: " << SSL_get_error(ssl, l);
 #endif
             return 0; // Fehler
         }

+ 97 - 70
Network/Klient.h

@@ -1,9 +1,10 @@
 #ifndef Klient_H
 #define Klient_H
 
-#include "Network.h"
 #include <ReferenceCounter.h>
 
+#include "Network.h"
+
 #ifdef INCLUDE_SSL
 #    include <openssl/bio.h>
 #    include <openssl/ssl.h>
@@ -15,85 +16,111 @@ struct BIO;
 
 namespace Framework
 {
-	namespace Encryption
-	{
-		class Key;
-	}
+    namespace Encryption
+    {
+        class Key;
+    }
 
-	class Text;
-}
+    class Text;
+} // namespace Framework
 
 using namespace Framework;
 
 namespace Network
 {
-	class Klient; // aus dieser Datei
+    class Klient; // aus dieser Datei
 
-	class Klient : public EncryptedVerbindung, public virtual ReferenceCounter
-	{
-	private:
-		SOCKET sock;
-		sockaddr_in server;
-		Encryption::Key* sendeKey;
-		Encryption::Key* empfangKey;
-		int downStreamBytes;
-		int upStreamBytes;
+    class Klient : public EncryptedVerbindung,
+                   public virtual ReferenceCounter
+    {
+    private:
+        SOCKET sock;
+        sockaddr_in server;
+        Encryption::Key* sendeKey;
+        Encryption::Key* empfangKey;
+        int downStreamBytes;
+        int upStreamBytes;
         bool errorOccured;
 
-	public:
-		// Konstruktor 
-		__declspec(dllexport) Klient();
-		// Destruktor 
-		__declspec(dllexport) ~Klient();
-		// nicht constant 
-		__declspec(dllexport) void setSendeKeyZ(Encryption::Key* key); // Setzt den Schlüssel fürs Senden
-		__declspec(dllexport) void setEmpfangKeyZ(Encryption::Key* key); // Setzt den Schlüssel fürs Empfangen
-		__declspec(dllexport) void setSendeKey(const char* key, int len); // Setzt den Schlüssel fürs Senden
-		__declspec(dllexport) void setEmpfangKey(const char* key, int len); // Setzt den Schlüssel fürs Empfangen
-		__declspec(dllexport) bool verbinde(unsigned short port, const char* ip); // verbindet mit Server
-		__declspec(dllexport) bool sende(const char* nachricht, int len) override; // sendet zum Server
-		__declspec(dllexport) bool getNachricht(char* nachricht, int len) override; // empfängt Nachricht
-		__declspec(dllexport) bool sendeEncrypted(const char* nachricht, int len) override; // sendet zum Server
-		__declspec(dllexport) bool getNachrichtEncrypted(char* nachricht, int len) override; // empfängt Nachricht
-		__declspec(dllexport) int getDownloadBytes(bool reset); // gibt die anzahl von empfangen bytes zurück
-		__declspec(dllexport) int getUploadBytes(bool reset); // gibt die anzahl von versendeter bytes zurück
-		__declspec(dllexport) bool trenne(); // Trennt die Verbindung zum Server
-		// constant 
-		__declspec(dllexport) bool hatNachricht(int zeit); // Wartet eine Zeit Lang auf eine Nachricht
-		__declspec(dllexport) unsigned short getServerPort() const; // gibt den Port des Servers zurück
-		__declspec(dllexport) const char* getServerIp() const; // gibt die Ip des Servers zurück
-		__declspec(dllexport) bool waitForNextMessage() const; // wartet bis es etwas zu empfangen gibt
-        __declspec(dllexport) bool isConnected() const; // gibt true zurück, wenn eine Verbindung besteht
-	};
+    public:
+        // Konstruktor
+        __declspec(dllexport) Klient();
+        // Destruktor
+        __declspec(dllexport) ~Klient();
+        // nicht constant
+        __declspec(dllexport) void setSendeKeyZ(
+            Encryption::Key* key); // Setzt den Schlüssel fürs Senden
+        __declspec(dllexport) void setEmpfangKeyZ(
+            Encryption::Key* key); // Setzt den Schlüssel fürs Empfangen
+        __declspec(dllexport) void setSendeKey(
+            const char* key, int len); // Setzt den Schlüssel fürs Senden
+        __declspec(dllexport) void setEmpfangKey(
+            const char* key, int len); // Setzt den Schlüssel fürs Empfangen
+        __declspec(dllexport) bool verbinde(
+            unsigned short port, const char* ip); // verbindet mit Server
+        __declspec(dllexport) bool sende(
+            const char* nachricht, int len) override; // sendet zum Server
+        __declspec(dllexport) bool getNachricht(
+            char* nachricht, int len) override; // empfängt Nachricht
+        __declspec(dllexport) bool sendeEncrypted(
+            const char* nachricht, int len) override; // sendet zum Server
+        __declspec(dllexport) bool getNachrichtEncrypted(
+            char* nachricht, int len) override; // empfängt Nachricht
+        __declspec(dllexport) int getDownloadBytes(
+            bool reset); // gibt die anzahl von empfangen bytes zurück
+        __declspec(dllexport) int getUploadBytes(
+            bool reset); // gibt die anzahl von versendeter bytes zurück
+        __declspec(dllexport) bool trenne(); // Trennt die Verbindung zum Server
+        // constant
+        __declspec(dllexport) bool hatNachricht(
+            int zeit); // Wartet eine Zeit Lang auf eine Nachricht
+        __declspec(dllexport) unsigned short getServerPort()
+            const; // gibt den Port des Servers zurück
+        __declspec(dllexport) const
+            char* getServerIp() const; // gibt die Ip des Servers zurück
+        __declspec(dllexport) bool waitForNextMessage()
+            const; // wartet bis es etwas zu empfangen gibt
+        __declspec(dllexport) bool isConnected()
+            const; // gibt true zurück, wenn eine Verbindung besteht
+    };
 
-	class SSLKlient : public Verbindung, public virtual ReferenceCounter
-	{
-	private:
-		unsigned short port;
-		Text* ip;
-		SSL_CTX* ctx;
-		SSL* ssl;
-		BIO* bio;
-		int downStreamBytes;
-		int upStreamBytes;
-		bool connected;
+    class SSLKlient : public Verbindung,
+                      public virtual ReferenceCounter
+    {
+    private:
+        unsigned short port;
+        Text* ip;
+        SSL_CTX* ctx;
+        SSL* ssl;
+        BIO* bio;
+        int downStreamBytes;
+        int upStreamBytes;
+        bool connected;
 
-	public:
-		// Konstruktor 
-		__declspec(dllexport) SSLKlient();
-		// Destruktor 
-		__declspec(dllexport) ~SSLKlient();
-		__declspec(dllexport) bool verbinde(unsigned short port, const char* ip); // verbindet mit Server
-		__declspec(dllexport) bool sende(const char* nachricht, int len) override; // sendet zum Server
-		__declspec(dllexport) bool getNachricht(char* nachricht, int len) override; // empfängt Nachricht
-		__declspec(dllexport) int getDownloadBytes(bool reset); // gibt die anzahl von empfangen bytes zurück
-		__declspec(dllexport) int getUploadBytes(bool reset); // gibt die anzahl von versendeter bytes zurück
-		__declspec(dllexport) bool trenne(); // Trennt die Verbindung zum Server
-		// constant 
-		__declspec(dllexport) bool hatNachricht(int zeit); // Wartet eine Zeit Lang auf eine Nachricht
-		__declspec(dllexport) unsigned short getServerPort() const; // gibt den Port des Servers zurück
-		__declspec(dllexport) const char* getServerIp() const; // gibt die Ip des Servers zurück
-	};
-}
+    public:
+        // Konstruktor
+        __declspec(dllexport) SSLKlient();
+        // Destruktor
+        __declspec(dllexport) ~SSLKlient();
+        __declspec(dllexport) bool verbinde(
+            unsigned short port, const char* ip); // verbindet mit Server
+        __declspec(dllexport) bool sende(
+            const char* nachricht, int len) override; // sendet zum Server
+        __declspec(dllexport) bool getNachricht(
+            char* nachricht, int len) override; // empfängt Nachricht
+        __declspec(dllexport) int getDownloadBytes(
+            bool reset); // gibt die anzahl von empfangen bytes zurück
+        __declspec(dllexport) int getUploadBytes(
+            bool reset); // gibt die anzahl von versendeter bytes zurück
+        __declspec(dllexport) bool trenne(); // Trennt die Verbindung zum Server
+        // constant
+        __declspec(dllexport) bool hatNachricht(
+            int zeit); // Wartet eine Zeit Lang auf eine Nachricht
+        __declspec(dllexport) unsigned short getServerPort()
+            const; // gibt den Port des Servers zurück
+        __declspec(dllexport) const
+            char* getServerIp() const; // gibt die Ip des Servers zurück
+    };
+} // namespace Network
 
 #endif

+ 92 - 98
Network/Network.cpp

@@ -1,144 +1,138 @@
 #include "Network.h"
 #ifndef WIN32
-#include <iostream>
-#include <netdb.h>
-#include <signal.h>
+#    include <iostream>
+#    include <netdb.h>
+#    include <signal.h>
 #endif
+#include <Logging.h>
+#include <openssl/bio.h>
 #include <openssl/err.h>
 #include <openssl/ssl.h>
-#include <openssl/bio.h>
 #include <Text.h>
 
 // Starte Netzwerk
 void Network::Start(int maxClients)
 {
 #ifdef WIN32
-	WSADATA lpwd;
-	lpwd.iMaxSockets = maxClients;
-	int fehler = WSAStartup(MAKEWORD(2, 0), &lpwd);
-	if (fehler != 0)
-		MessageBox(0, "Win Sock 2.0 konnte nocht gestartet werden.", "Fehler", MB_ICONERROR);
+    WSADATA lpwd;
+    lpwd.iMaxSockets = maxClients;
+    int fehler = WSAStartup(MAKEWORD(2, 0), &lpwd);
+    if (fehler != 0)
+        Framework::Logging::error()
+            << "Could not initialize Win Sock 2.0 WSAStartup: " << fehler;
 #else
-	signal(SIGPIPE, SIG_IGN);
+    signal(SIGPIPE, SIG_IGN);
 #endif
-	SSL_library_init();
-	SSL_load_error_strings();
-	OpenSSL_add_ssl_algorithms();
+    SSL_library_init();
+    SSL_load_error_strings();
+    OpenSSL_add_ssl_algorithms();
 }
 
 void Network::getHostName(char* name, int bufferLen)
 {
-	gethostname(name, bufferLen);
+    gethostname(name, bufferLen);
 }
 
 char* Network::getHostAddresse()
 {
-	char* addresse;
-	char name[255] = "";
-	getHostName(name, 255);
-	PHOSTENT hostinfo;
-	hostinfo = gethostbyname(name);
-	if (!hostinfo)
-	{
-#ifdef WIN32
-		MessageBox(0, "Die Ip Addresse konnte nicht ermittelt werden.", "Fehler", MB_ICONERROR);
-#else
-		std::cout << "Fehler: Die Ip Addresse konnte nicht ermittelt werden.";
-#endif
-		return 0;
-	}
-	addresse = inet_ntoa(*(struct in_addr*)*hostinfo->h_addr_list);
-	return addresse;
+    char* addresse;
+    char name[255] = "";
+    getHostName(name, 255);
+    PHOSTENT hostinfo;
+    hostinfo = gethostbyname(name);
+    if (!hostinfo)
+    {
+        Framework::Logging::error()
+            << "The ip address of host '" << name << "' could not be resolved";
+        return 0;
+    }
+    addresse = inet_ntoa(*(struct in_addr*)*hostinfo->h_addr_list);
+    return addresse;
 }
 
-
 // Beende Netzwerk
 void Network::Exit()
 {
 #ifdef WIN32
-	WSACleanup();
+    WSACleanup();
 #endif
 }
 
-
 Network::NetworkReader::NetworkReader(Verbindung* v)
 {
-	verbindung = v;
+    verbindung = v;
 }
 
-Network::NetworkReader::~NetworkReader()
-{}
+Network::NetworkReader::~NetworkReader() {}
 
 //! Ließt aus der Datei
 //! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
 //! \param len Wie viele Bytes aus der Resource gelesen werden sollen
 void Network::NetworkReader::lese(char* bytes, int len)
 {
-	verbindung->getNachricht(bytes, len);
+    verbindung->getNachricht(bytes, len);
 }
 
 //! Ließt die nächste zeile der Resource ein
 //! \return Die gelesene Zeile als Text mit zeilenumbruch
 Framework::Text* Network::NetworkReader::leseZeile()
 {
-	int maxLength = 2048;
-	char* buffer = new char[maxLength];
-	char b;
-	int index = 0;
-	do
-	{
-		verbindung->getNachricht(&b, 1);
-		buffer[index++] = b;
-		if (index == maxLength)
-		{
-			maxLength += 2048;
-			char* tmp = new char[maxLength];
-			memcpy(tmp, buffer, (__int64)maxLength - 2048);
-			delete[] buffer;
-			buffer = tmp;
-		}
-	} while (b != '\n');
-	buffer[index] = 0;
-	Framework::Text* result = new Framework::Text(buffer);
-	delete[] buffer;
-	return result;
+    int maxLength = 2048;
+    char* buffer = new char[maxLength];
+    char b;
+    int index = 0;
+    do
+    {
+        verbindung->getNachricht(&b, 1);
+        buffer[index++] = b;
+        if (index == maxLength)
+        {
+            maxLength += 2048;
+            char* tmp = new char[maxLength];
+            memcpy(tmp, buffer, (__int64)maxLength - 2048);
+            delete[] buffer;
+            buffer = tmp;
+        }
+    } while (b != '\n');
+    buffer[index] = 0;
+    Framework::Text* result = new Framework::Text(buffer);
+    delete[] buffer;
+    return result;
 }
 
 //! Prüft, ob die Resource vollständig gelesen wurde
 //!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
 bool Network::NetworkReader::istEnde() const
 {
-	return 0;
+    return 0;
 }
 
-
 Network::NetworkWriter::NetworkWriter(Verbindung* v)
 {
-	verbindung = v;
+    verbindung = v;
 }
 
-Network::NetworkWriter::~NetworkWriter()
-{}
+Network::NetworkWriter::~NetworkWriter() {}
 
 //! Schreibt in die Resource
-//! \param bytes Ein Array, der die Bytes enthält, welche in die Resource geschrieben werden soll
-//! \param len Wie viele Bytes in die Resource geschrieben werden sollen
+//! \param bytes Ein Array, der die Bytes enthält, welche in die Resource
+//! geschrieben werden soll \param len Wie viele Bytes in die Resource
+//! geschrieben werden sollen
 void Network::NetworkWriter::schreibe(const char* bytes, int len)
 {
-	verbindung->sende(bytes, len);
+    verbindung->sende(bytes, len);
 }
 
 //! Prüft, ob die Resource vollständig geschrieben wurde
 //!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
 bool Network::NetworkWriter::istEnde() const
 {
-	return 0;
+    return 0;
 }
 
-
 Network::EncryptedNetworkReader::EncryptedNetworkReader(EncryptedVerbindung* v)
 {
-	verbindung = v;
+    verbindung = v;
 }
 
 //! Ließt aus der Datei
@@ -146,60 +140,60 @@ Network::EncryptedNetworkReader::EncryptedNetworkReader(EncryptedVerbindung* v)
 //! \param len Wie viele Bytes aus der Resource gelesen werden sollen
 void Network::EncryptedNetworkReader::lese(char* bytes, int len)
 {
-	verbindung->getNachrichtEncrypted(bytes, len);
+    verbindung->getNachrichtEncrypted(bytes, len);
 }
 
 //! Ließt die nächste zeile der Resource ein
 //! \return Die gelesene Zeile als Text mit zeilenumbruch
 Framework::Text* Network::EncryptedNetworkReader::leseZeile()
 {
-	int maxLength = 2048;
-	char* buffer = new char[maxLength];
-	char b;
-	int index = 0;
-	do
-	{
-		verbindung->getNachrichtEncrypted(&b, 1);
-		buffer[index++] = b;
-		if (index == maxLength)
-		{
-			maxLength += 2048;
-			char* tmp = new char[maxLength];
-			memcpy(tmp, buffer, (__int64)maxLength - 2048);
-			delete[] buffer;
-			buffer = tmp;
-		}
-	} while (b != '\n');
-	buffer[index] = 0;
-	Framework::Text* result = new Framework::Text(buffer);
-	delete[] buffer;
-	return result;
+    int maxLength = 2048;
+    char* buffer = new char[maxLength];
+    char b;
+    int index = 0;
+    do
+    {
+        verbindung->getNachrichtEncrypted(&b, 1);
+        buffer[index++] = b;
+        if (index == maxLength)
+        {
+            maxLength += 2048;
+            char* tmp = new char[maxLength];
+            memcpy(tmp, buffer, (__int64)maxLength - 2048);
+            delete[] buffer;
+            buffer = tmp;
+        }
+    } while (b != '\n');
+    buffer[index] = 0;
+    Framework::Text* result = new Framework::Text(buffer);
+    delete[] buffer;
+    return result;
 }
 
 //! Prüft, ob die Resource vollständig gelesen wurde
 //!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
 bool Network::EncryptedNetworkReader::istEnde() const
 {
-	return 0;
+    return 0;
 }
 
-
 Network::EncryptedNetworkWriter::EncryptedNetworkWriter(EncryptedVerbindung* v)
 {
-	verbindung = v;
+    verbindung = v;
 }
 
 //! Schreibt in die Resource
-//! \param bytes Ein Array, der die Bytes enthält, welche in die Resource geschrieben werden soll
-//! \param len Wie viele Bytes in die Resource geschrieben werden sollen
+//! \param bytes Ein Array, der die Bytes enthält, welche in die Resource
+//! geschrieben werden soll \param len Wie viele Bytes in die Resource
+//! geschrieben werden sollen
 void Network::EncryptedNetworkWriter::schreibe(const char* bytes, int len)
 {
-	verbindung->sendeEncrypted(bytes, len);
+    verbindung->sendeEncrypted(bytes, len);
 }
 
 //! Prüft, ob die Resource vollständig geschrieben wurde
 //!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
 bool Network::EncryptedNetworkWriter::istEnde() const
 {
-	return 0;
+    return 0;
 }

+ 120 - 111
Network/Network.h

@@ -2,137 +2,146 @@
 #define Network_H
 
 #ifdef WIN32
-#ifdef _DEBUG
-#ifndef _LTMDB
-#define _CRTDBG_MAP_ALLOC
-#include <stdlib.h>
-#include <crtdbg.h>
-#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
-#define new DEBUG_CLIENTBLOCK
-#define _LTMDB
-#endif
-#endif
-#define _WINSOCK_DEPRECATED_NO_WARNINGS
-#include <WinSock2.h>
+#    ifdef _DEBUG
+#        ifndef _LTMDB
+#            define _CRTDBG_MAP_ALLOC
+#            include <crtdbg.h>
+#            include <stdlib.h>
+#            define DEBUG_CLIENTBLOCK new (_CLIENT_BLOCK, __FILE__, __LINE__)
+#            define new               DEBUG_CLIENTBLOCK
+#            define _LTMDB
+#        endif
+#    endif
+#    define _WINSOCK_DEPRECATED_NO_WARNINGS
+#    include <WinSock2.h>
 #else
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <iostream>
-#define __declspec( x )
-#define __int64           long long
-#ifndef SOCKET
-#define SOCKET            int
-#define SOCKADDR_IN       sockaddr_in
-#define ADDR_ANY          INADDR_ANY
-#define closesocket       close
-#define PHOSTENT          hostent*
-#endif
+#    include <arpa/inet.h>
+#    include <fcntl.h>
+#    include <iostream>
+#    include <netinet/in.h>
+#    include <sys/socket.h>
+#    include <sys/time.h>
+#    include <unistd.h>
+#    define __declspec(x)
+#    define __int64 long long
+#    ifndef SOCKET
+#        define SOCKET      int
+#        define SOCKADDR_IN sockaddr_in
+#        define ADDR_ANY    INADDR_ANY
+#        define closesocket close
+#        define PHOSTENT    hostent*
+#    endif
 #endif
 #include <Reader.h>
 #include <Writer.h>
 
 namespace Framework
 {
-	class Text;
+    class Text;
 }
 
 namespace Network
 {
-	__declspec(dllexport) void Start(int maxClients);
-	__declspec(dllexport) void getHostName(char* name, int bufferLen);
-	__declspec(dllexport) char* getHostAddresse();
-	__declspec(dllexport) void Exit();
+    __declspec(dllexport) void Start(int maxClients);
+    __declspec(dllexport) void getHostName(char* name, int bufferLen);
+    __declspec(dllexport) char* getHostAddresse();
+    __declspec(dllexport) void Exit();
 
+    class Verbindung
+    {
+    public:
+        virtual bool sende(const char* nachricht, int len)
+            = 0; // sendet Nachricht
+        virtual bool getNachricht(char* nachricht, int len)
+            = 0; // empfängt Nachricht
+    };
 
-	class Verbindung
-	{
-	public:
-		virtual bool sende(const char* nachricht, int len) = 0; // sendet Nachricht
-		virtual bool getNachricht(char* nachricht, int len) = 0; // empfängt Nachricht
-	};
+    class EncryptedVerbindung : public Verbindung
+    {
+    public:
+        virtual bool sendeEncrypted(const char* nachricht, int len)
+            = 0; // sendet Nachricht
+        virtual bool getNachrichtEncrypted(char* nachricht, int len)
+            = 0; // empfängt Nachricht
+    };
 
-	class EncryptedVerbindung : public Verbindung
-	{
-	public:
-		virtual bool sendeEncrypted(const char* nachricht, int len) = 0; // sendet Nachricht
-		virtual bool getNachrichtEncrypted(char* nachricht, int len) = 0; // empfängt Nachricht
-	};
+    class NetworkReader : public Framework::StreamReader
+    {
+    private:
+        Verbindung* verbindung;
 
-	class NetworkReader : public Framework::StreamReader
-	{
-	private:
-		Verbindung* verbindung;
+    public:
+        __declspec(dllexport) NetworkReader(Verbindung* v);
+        __declspec(dllexport) virtual ~NetworkReader();
+        //! Ließt aus der Datei
+        //! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt
+        //! werden soll \param len Wie viele Bytes aus der Resource gelesen
+        //! werden sollen
+        __declspec(dllexport) void lese(char* bytes, int len) override;
+        //! Ließt die nächste zeile der Resource ein
+        //! \return Die gelesene Zeile als Text mit zeilenumbruch
+        __declspec(dllexport) Framework::Text* leseZeile() override;
+        //! Prüft, ob die Resource vollständig gelesen wurde
+        //!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+        __declspec(dllexport) bool istEnde() const override;
+    };
 
-	public:
-		__declspec(dllexport) NetworkReader(Verbindung* v);
-		__declspec(dllexport) virtual ~NetworkReader();
-		//! Ließt aus der Datei
-		//! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
-		//! \param len Wie viele Bytes aus der Resource gelesen werden sollen
-		__declspec(dllexport) void lese(char* bytes, int len) override;
-		//! Ließt die nächste zeile der Resource ein
-		//! \return Die gelesene Zeile als Text mit zeilenumbruch
-		__declspec(dllexport) Framework::Text* leseZeile() override;
-		//! Prüft, ob die Resource vollständig gelesen wurde
-		//!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
-		__declspec(dllexport) bool istEnde() const override;
-	};
+    class NetworkWriter : public Framework::StreamWriter
+    {
+    private:
+        Verbindung* verbindung;
 
-	class NetworkWriter : public Framework::StreamWriter
-	{
-	private:
-		Verbindung* verbindung;
+    public:
+        __declspec(dllexport) NetworkWriter(Verbindung* v);
+        __declspec(dllexport) virtual ~NetworkWriter();
+        //! Schreibt in die Resource
+        //! \param bytes Ein Array, der die Bytes enthält, welche in die
+        //! Resource geschrieben werden soll \param len Wie viele Bytes in die
+        //! Resource geschrieben werden sollen
+        __declspec(dllexport) void schreibe(
+            const char* bytes, int len) override;
+        //! Prüft, ob die Resource vollständig geschrieben wurde
+        //!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
+        __declspec(dllexport) bool istEnde() const override;
+    };
 
-	public:
-		__declspec(dllexport) NetworkWriter(Verbindung* v);
-		__declspec(dllexport) virtual ~NetworkWriter();
-		//! Schreibt in die Resource
-		//! \param bytes Ein Array, der die Bytes enthält, welche in die Resource geschrieben werden soll
-		//! \param len Wie viele Bytes in die Resource geschrieben werden sollen
-		__declspec(dllexport) void schreibe(const char* bytes, int len) override;
-		//! Prüft, ob die Resource vollständig geschrieben wurde
-		//!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
-		__declspec(dllexport) bool istEnde() const override;
-	};
+    class EncryptedNetworkReader : public Framework::StreamReader
+    {
+    private:
+        EncryptedVerbindung* verbindung;
 
-	class EncryptedNetworkReader : public Framework::StreamReader
-	{
-	private:
-		EncryptedVerbindung* verbindung;
+    public:
+        __declspec(dllexport) EncryptedNetworkReader(EncryptedVerbindung* v);
+        //! Ließt aus der Datei
+        //! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt
+        //! werden soll \param len Wie viele Bytes aus der Resource gelesen
+        //! werden sollen
+        __declspec(dllexport) void lese(char* bytes, int len) override;
+        //! Ließt die nächste zeile der Resource ein
+        //! \return Die gelesene Zeile als Text mit zeilenumbruch
+        __declspec(dllexport) Framework::Text* leseZeile() override;
+        //! Prüft, ob die Resource vollständig gelesen wurde
+        //!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+        __declspec(dllexport) bool istEnde() const override;
+    };
 
-	public:
-		__declspec(dllexport) EncryptedNetworkReader(EncryptedVerbindung* v);
-		//! Ließt aus der Datei
-		//! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
-		//! \param len Wie viele Bytes aus der Resource gelesen werden sollen
-		__declspec(dllexport) void lese(char* bytes, int len) override;
-		//! Ließt die nächste zeile der Resource ein
-		//! \return Die gelesene Zeile als Text mit zeilenumbruch
-		__declspec(dllexport) Framework::Text* leseZeile() override;
-		//! Prüft, ob die Resource vollständig gelesen wurde
-		//!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
-		__declspec(dllexport) bool istEnde() const override;
-	};
+    class EncryptedNetworkWriter : public Framework::StreamWriter
+    {
+    private:
+        EncryptedVerbindung* verbindung;
 
-	class EncryptedNetworkWriter : public Framework::StreamWriter
-	{
-	private:
-		EncryptedVerbindung* verbindung;
-
-	public:
-		__declspec(dllexport) EncryptedNetworkWriter(EncryptedVerbindung* v);
-		//! Schreibt in die Resource
-		//! \param bytes Ein Array, der die Bytes enthält, welche in die Resource geschrieben werden soll
-		//! \param len Wie viele Bytes in die Resource geschrieben werden sollen
-		__declspec(dllexport) void schreibe(const char* bytes, int len) override;
-		//! Prüft, ob die Resource vollständig geschrieben wurde
-		//!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
-		__declspec(dllexport) bool istEnde() const override;
-	};
-}
+    public:
+        __declspec(dllexport) EncryptedNetworkWriter(EncryptedVerbindung* v);
+        //! Schreibt in die Resource
+        //! \param bytes Ein Array, der die Bytes enthält, welche in die
+        //! Resource geschrieben werden soll \param len Wie viele Bytes in die
+        //! Resource geschrieben werden sollen
+        __declspec(dllexport) void schreibe(
+            const char* bytes, int len) override;
+        //! Prüft, ob die Resource vollständig geschrieben wurde
+        //!  return 1, wenn die Resource vollständig geschrieben wurde. 0, sonst
+        __declspec(dllexport) bool istEnde() const override;
+    };
+} // namespace Network
 
 #endif

+ 2 - 0
Network/Network.vcxproj

@@ -112,6 +112,7 @@
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
       <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;NETWORK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <LanguageStandard>stdcpp20</LanguageStandard>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -160,6 +161,7 @@ copy "..\Release\Network.dll" "..\..\..\Spiele Platform\SMP\Fertig\x32\network.d
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;NETWORK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <LanguageStandard>stdcpp20</LanguageStandard>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>

+ 27 - 26
Network/Server.cpp

@@ -7,6 +7,7 @@
 #endif
 #include <iostream>
 #include <Key.h>
+#include <Logging.h>
 #include <Text.h>
 
 using namespace Network;
@@ -206,8 +207,8 @@ bool SKlient::sende(const char* nachricht, int len) // sendet zum Klient
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "send: " << l << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "send: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
             return 0; // Fehler
@@ -231,8 +232,8 @@ bool SKlient::getNachricht(
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "recv: " << l << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "recv: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
             return 0; // Fehler
@@ -262,8 +263,8 @@ bool SKlient::sendeEncrypted(
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "send: " << l << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "send: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
             n->release();
@@ -289,8 +290,8 @@ bool SKlient::getNachrichtEncrypted(
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "recv: " << l << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "recv: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
             return 0; // Fehler
@@ -343,8 +344,8 @@ bool SKlient::hatNachricht(
     {
 #ifdef WIN32
 #    ifdef _DEBUG
-        std::cout << "select: " << result << " Error: " << WSAGetLastError()
-                  << std::endl;
+        Framework::Logging::warning()
+            << "select: " << result << " Error: " << WSAGetLastError();
 #    endif
 #endif
     }
@@ -372,10 +373,9 @@ bool SSLErrorCheck(int result, SSL* ssl, const char* action)
 {
     if (result <= 0)
     {
-        std::cout << "ERROR: '" << action
-                  << "' returned error code: " << SSL_get_error(ssl, result)
-                  << "\n";
-        std::cout.flush();
+        Framework::Logging::error()
+            << "'" << action
+            << "' returned error code: " << SSL_get_error(ssl, result);
         return 0;
     }
     return 1;
@@ -386,10 +386,10 @@ bool SSLErrorCheck(__int64 result, const char* action)
     if (result <= 0)
     {
         unsigned long error = ERR_get_error();
-        std::cout << "ERROR: '" << action << "' returned " << result
-                  << " error code: " << error << "("
-                  << ERR_reason_error_string(error) << ")\n";
-        std::cout.flush();
+
+        Framework::Logging::error() << "'" << action << "' returned " << result
+                                    << " error code: " << error << "("
+                                    << ERR_reason_error_string(error) << ")";
         return 0;
     }
     return 1;
@@ -412,8 +412,8 @@ bool SKlient::waitForNextMessage()
         {
 #ifdef WIN32
 #    ifdef _DEBUG
-            std::cout << "select: " << rv << " Error: " << WSAGetLastError()
-                      << std::endl;
+            Framework::Logging::warning()
+                << "select: " << rv << " Error: " << WSAGetLastError();
 #    endif
 #endif
             return 0;
@@ -430,8 +430,9 @@ bool SKlient::waitForNextMessage()
     {
 #ifdef WIN32
 #    ifdef _DEBUG
-        std::cout << "recv: " << l << " Error: " << WSAGetLastError()
-                  << std::endl;
+
+        Framework::Logging::warning()
+            << "recv: " << l << " Error: " << WSAGetLastError();
 #    endif
 #endif
         return 0; // Fehler
@@ -661,8 +662,8 @@ bool SSLSKlient::sende(const char* nachricht, int len) // sendet zum Klient
         if (l <= 0)
         {
 #ifdef _DEBUG
-            std::cout << "SSL_write: " << l
-                      << " Error: " << SSL_get_error(ssl, l) << std::endl;
+            Framework::Logging::warning()
+                << "SSL_write: " << l << " Error: " << SSL_get_error(ssl, l);
 #endif
             return 0; // Fehler
         }
@@ -684,8 +685,8 @@ bool SSLSKlient::getNachricht(
         if (l <= 0)
         {
 #ifdef _DEBUG
-            std::cout << "SSL_read: " << l
-                      << " Error: " << SSL_get_error(ssl, l) << std::endl;
+            Framework::Logging::warning()
+                << "SSL_read: " << l << " Error: " << SSL_get_error(ssl, l);
 #endif
             return 0; // Fehler
         }

+ 436 - 375
Network/WebSocket.cpp

@@ -1,413 +1,474 @@
 #include "WebSocket.h"
-#include "HttpRequest.h"
+
 #include <iostream>
 
+#include "HttpRequest.h"
+
 using namespace Network;
 using namespace WebSocket;
 using namespace Framework;
 
-__declspec(dllexport) Frame& Frame::operator+=(const Frame& b) // baut frames zusammen welche zu einer nachricht gehören
+__declspec(dllexport) Frame& Frame::operator+=(
+    const Frame& b) // baut frames zusammen welche zu einer nachricht gehören
 {
-	fin = b.fin;
-	if (opcode == 0)
-		opcode = b.opcode;
-	dataLength += b.dataLength;
-	if (dataLength)
-	{
-		char* data = new char[(int)dataLength];
-		if (data)
-			memcpy(data, this->data, (int)(dataLength - b.dataLength));
-		if (b.data)
-			memcpy(data + dataLength, b.data, (int)b.dataLength);
-		delete[] this->data;
-		this->data = data;
-	}
-	else
-	{
-		delete[] this->data;
-		this->data = 0;
-	}
-	return *this;
+    fin = b.fin;
+    if (opcode == 0) opcode = b.opcode;
+    dataLength += b.dataLength;
+    if (dataLength)
+    {
+        char* data = new char[(int)dataLength];
+        if (data) memcpy(data, this->data, (int)(dataLength - b.dataLength));
+        if (b.data) memcpy(data + dataLength, b.data, (int)b.dataLength);
+        delete[] this->data;
+        this->data = data;
+    }
+    else
+    {
+        delete[] this->data;
+        this->data = 0;
+    }
+    return *this;
 }
 
-
-__declspec(dllexport) WebSocketClient::WebSocketClient(const char* path, const char* host, unsigned short port)
-	: Thread()
+__declspec(dllexport) WebSocketClient::WebSocketClient(
+    const char* path, const char* host, unsigned short port)
+    : Thread()
 {
-	queue = new Array< Frame >();
-	callback = 0;
-	klient = 0;
-	this->path = path;
-	this->host = host;
-	this->port = port;
-	lastPingFrame = 0;
-	nextClose = 0;
+    queue = new Array<Frame>();
+    callback = 0;
+    klient = 0;
+    this->path = path;
+    this->host = host;
+    this->port = port;
+    lastPingFrame = 0;
+    nextClose = 0;
 }
 
 WebSocketClient::~WebSocketClient()
 {
-	disconnect();
-	while (queue->getEintragAnzahl())
-	{
-		Frame f = queue->get(0);
-		delete[] f.data;
-		queue->remove(0);
-	}
-	queue->release();
+    disconnect();
+    while (queue->getEintragAnzahl())
+    {
+        Frame f = queue->get(0);
+        delete[] f.data;
+        queue->remove(0);
+    }
+    queue->release();
 }
 
-__declspec(dllexport) void WebSocketClient::setMessageCallback(std::function< void(WebSocketClient*, __int64 size, const char* data, DataType typ) > callback)
+__declspec(dllexport) void WebSocketClient::setMessageCallback(
+    std::function<void(
+        WebSocketClient*, __int64 size, const char* data, DataType typ)>
+        callback)
 {
-	this->callback = callback;
+    this->callback = callback;
 }
 
 __declspec(dllexport) bool WebSocketClient::connect()
 {
-	char allowedKeyChars[] = { 'a', 'b','c','d','e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
-		'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
-		'4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
-		'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0 };
-	__int64 numKeyChars = strlen(allowedKeyChars);
-	if (!klient)
-	{
-		Text message = "GET ";
-		message += path;
-		message += " HTTP/1.1\r\n";
-		message += "Host: ";
-		message += host;
-		message += "\r\nUpgrade: websocket\r\n";
-		message += "Connection: Upgrade\r\n";
-		char* key = new char[25];
-		key[24] = 0;
-		key[23] = '=';
-		key[22] = '=';
-		for (int i = 0; i < 22; i++)
-			key[i] = allowedKeyChars[(int)(gen.rand() * numKeyChars)];
-		message += "Sec-WebSocket-Key: ";
-		message += key;
-		delete[] key;
-		message += "\r\nSec-WebSocket-Version: 13\r\n\r\n";
-		klient = new Klient();
-		if (!klient->verbinde(port, host))
-		{
-			klient = (Klient*)klient->release();
-			return 0;
-		}
-		klient->sende(message, message.getLength());
-		Text answer;
-		int br = 0;
-		do
-		{
-			char buff[2];
-			buff[1] = 0;
-			if (klient->getNachricht(buff, 1))
-				answer += buff;
-			else
-				break;
-			if (buff[0] == '\n')
-				br++;
-			else if (buff[0] != '\r')
-				br = 0;
-		} while (br < 2 && klient->hatNachricht(1000));
-		HTTP::Answer* handshakeResponse = new HTTP::Answer(answer);
-		if (handshakeResponse->getStatusCode() != 101)
-		{
-			handshakeResponse->release();
-			klient = (Klient*)klient->release();
-			return 0;
-		}
-		handshakeResponse->release();
-		start();
-		return 1;
-	}
-	else
-		return 1;
+    char allowedKeyChars[] = {'a',
+        'b',
+        'c',
+        'd',
+        'e',
+        'f',
+        'g',
+        'h',
+        'i',
+        'j',
+        'k',
+        'l',
+        'm',
+        'n',
+        'o',
+        'p',
+        'q',
+        'r',
+        's',
+        't',
+        'u',
+        'v',
+        'w',
+        'x',
+        'y',
+        'z',
+        '0',
+        '1',
+        '2',
+        '3',
+        '4',
+        '5',
+        '6',
+        '7',
+        '8',
+        '9',
+        'A',
+        'B',
+        'C',
+        'D',
+        'E',
+        'F',
+        'G',
+        'H',
+        'I',
+        'J',
+        'K',
+        'L',
+        'M',
+        'N',
+        'O',
+        'P',
+        'Q',
+        'R',
+        'S',
+        'T',
+        'U',
+        'V',
+        'W',
+        'X',
+        'Y',
+        'Z',
+        0};
+    __int64 numKeyChars = strlen(allowedKeyChars);
+    if (!klient)
+    {
+        Text message = "GET ";
+        message += path;
+        message += " HTTP/1.1\r\n";
+        message += "Host: ";
+        message += host;
+        message += "\r\nUpgrade: websocket\r\n";
+        message += "Connection: Upgrade\r\n";
+        char* key = new char[25];
+        key[24] = 0;
+        key[23] = '=';
+        key[22] = '=';
+        for (int i = 0; i < 22; i++)
+            key[i] = allowedKeyChars[(int)(gen.rand() * numKeyChars)];
+        message += "Sec-WebSocket-Key: ";
+        message += key;
+        delete[] key;
+        message += "\r\nSec-WebSocket-Version: 13\r\n\r\n";
+        klient = new Klient();
+        if (!klient->verbinde(port, host))
+        {
+            klient = (Klient*)klient->release();
+            return 0;
+        }
+        klient->sende(message, message.getLength());
+        Text answer;
+        int br = 0;
+        do
+        {
+            char buff[2];
+            buff[1] = 0;
+            if (klient->getNachricht(buff, 1))
+                answer += buff;
+            else
+                break;
+            if (buff[0] == '\n')
+                br++;
+            else if (buff[0] != '\r')
+                br = 0;
+        } while (br < 2 && klient->hatNachricht(1000));
+        HTTP::Answer* handshakeResponse = new HTTP::Answer(answer);
+        if (handshakeResponse->getStatusCode() != 101)
+        {
+            handshakeResponse->release();
+            klient = (Klient*)klient->release();
+            return 0;
+        }
+        handshakeResponse->release();
+        start();
+        return 1;
+    }
+    else
+        return 1;
 }
 
-__declspec(dllexport) bool WebSocketClient::send(__int64 size, const char* data, DataType typ)
+__declspec(dllexport) bool WebSocketClient::send(
+    __int64 size, const char* data, DataType typ)
 {
-	Frame f;
-	f.fin = 1;
-	f.rsv1 = 0;
-	f.rsv2 = 0;
-	f.rsv3 = 0;
-	f.mask = 1;
-	if (typ == TEXT)
-		f.opcode = 1;
-	else
-		f.opcode = 2;
-	f.dataLength = size;
-	f.data = new char[(int)f.dataLength];
-	memcpy(f.data, data, (int)f.dataLength);
-	f.key[0] = (unsigned char)(gen.rand() * 256);
-	f.key[1] = (unsigned char)(gen.rand() * 256);
-	f.key[2] = (unsigned char)(gen.rand() * 256);
-	f.key[3] = (unsigned char)(gen.rand() * 256);
-	c.lock();
-	queue->add(f);
-	c.unlock();
-	return 1;
+    Frame f;
+    f.fin = 1;
+    f.rsv1 = 0;
+    f.rsv2 = 0;
+    f.rsv3 = 0;
+    f.mask = 1;
+    if (typ == TEXT)
+        f.opcode = 1;
+    else
+        f.opcode = 2;
+    f.dataLength = size;
+    f.data = new char[(int)f.dataLength];
+    memcpy(f.data, data, (int)f.dataLength);
+    f.key[0] = (unsigned char)(gen.rand() * 256);
+    f.key[1] = (unsigned char)(gen.rand() * 256);
+    f.key[2] = (unsigned char)(gen.rand() * 256);
+    f.key[3] = (unsigned char)(gen.rand() * 256);
+    c.lock();
+    queue->add(f);
+    c.unlock();
+    return 1;
 }
 
 __declspec(dllexport) void WebSocketClient::thread()
 {
-	while (klient)
-	{
-		c2.lock();
-		if (!klient)
-		{
-			c2.unlock();
-			return;
-		}
-		if (klient->hatNachricht(100))
-		{
-			bool ok = 1;
-			c2.unlock();
-			bool first = 1;
-			Frame m;
-			unsigned char byte;
-			do
-			{
-				c2.lock();
-				if (!klient)
-				{
-					c2.unlock();
-					return;
-				}
-				Frame message;
-				ok &= klient->getNachricht((char*)&byte, 1);
-				message.fin = (byte & 0x80) != 0;
-				message.rsv1 = (byte & 0x40) != 0;
-				message.rsv2 = (byte & 0x20) != 0;
-				message.rsv3 = (byte & 0x10) != 0;
-				message.opcode = byte & 0xF;
-				ok &= klient->getNachricht((char*)&byte, 1);
-				message.mask = (byte & 0x80) != 0;
-				message.dataLength = byte & 0x7F;
-				if (message.dataLength == 126)
-				{
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength = byte << 8;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength |= byte;
-				}
-				else if (message.dataLength == 127)
-				{
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength = (__int64)byte << 56;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength |= (__int64)byte << 48;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength |= (__int64)byte << 40;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength |= (__int64)byte << 32;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength |= (__int64)byte << 24;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength |= (__int64)byte << 16;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength |= (__int64)byte << 8;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.dataLength |= (__int64)byte;
-				}
-				if (message.mask)
-				{
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.key[0] = byte;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.key[1] = byte;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.key[2] = byte;
-					ok &= klient->getNachricht((char*)&byte, 1);
-					message.key[3] = byte;
-				}
-				if (!ok)
-					message.dataLength = 1;
-				message.data = 0;
-				if (message.dataLength)
-					message.data = new char[(int)message.dataLength];
-				for (int i = 0; i < message.dataLength; i++)
-				{
-					ok &= klient->getNachricht((char*)&byte, 1);
-					if (message.mask)
-						message.data[i] = byte ^ message.key[i % 4];
-					else
-						message.data[i] = byte;
-				}
-				c2.unlock();
-				if (first)
-					m = message;
-				else
-				{
-					m += message;
-					delete[] message.data;
-				}
-				first = 0;
-				if (!ok)
-					break;
-			} while (!m.fin);
-			if (!ok)
-			{
-				delete[] m.data;
-				return;
-			}
-			if (m.opcode == 0x9)
-			{
-				m.opcode = 0xA;
-				m.key[0] = (unsigned char)(gen.rand() * 256);
-				m.key[1] = (unsigned char)(gen.rand() * 256);
-				m.key[2] = (unsigned char)(gen.rand() * 256);
-				m.key[3] = (unsigned char)(gen.rand() * 256);
-				queue->add(m);
-			}
-			else if (m.opcode == 0xA)
-			{
-				delete[] m.data;
-			}
-			else if (m.opcode == 0x8)
-			{
-				if (nextClose)
-				{
-					delete[] m.data;
-					c2.lock();
-					klient->trenne();
-					klient = (Klient*)klient->release();
-					c2.unlock();
-					return;
-				}
-				else
-				{
-					m.key[0] = (unsigned char)(gen.rand() * 256);
-					m.key[1] = (unsigned char)(gen.rand() * 256);
-					m.key[2] = (unsigned char)(gen.rand() * 256);
-					m.key[3] = (unsigned char)(gen.rand() * 256);
-					queue->add(m);
-					nextClose = 1;
-				}
-			}
-			else if (callback)
-			{
-				callback(this, m.dataLength, m.data, m.opcode == 1 ? TEXT : BINARY);
-				delete[] m.data;
-			}
-		}
-		else
-		{
-			c2.unlock();
-			c.lock();
-			while (queue->getEintragAnzahl())
-			{
-				Frame f = queue->get(0);
-				c.unlock();
-				unsigned char byte = (f.fin ? 1 : 0) << 7;
-				byte |= (f.rsv1 ? 1 : 0) << 6;
-				byte |= (f.rsv2 ? 1 : 0) << 5;
-				byte |= (f.rsv3 ? 1 : 0) << 4;
-				byte |= f.opcode & 0xF;
-				c2.lock();
-				if (!klient)
-				{
-					c2.unlock();
-					return;
-				}
-				klient->sende((char*)&byte, 1);
-				byte = (f.mask ? 1 : 0) << 7;
-				if (f.dataLength < 126)
-					byte |= (unsigned char)f.dataLength & 0x7F;
-				else if (f.dataLength <= 32767)
-					byte |= 126;
-				else
-					byte |= 127;
-				klient->sende((char*)&byte, 1);
-				if (f.dataLength >= 126)
-				{
-					if (f.dataLength <= 32767)
-					{
-						byte = (unsigned char)(f.dataLength >> 8);
-						klient->sende((char*)&byte, 1);
-						byte = (unsigned char)f.dataLength & 0xFF;
-						klient->sende((char*)&byte, 1);
-					}
-					else
-					{
-						byte = (unsigned char)(f.dataLength >> 56);
-						klient->sende((char*)&byte, 1);
-						byte = (unsigned char)(f.dataLength >> 48);
-						klient->sende((char*)&byte, 1);
-						byte = (unsigned char)(f.dataLength >> 40);
-						klient->sende((char*)&byte, 1);
-						byte = (unsigned char)(f.dataLength >> 32);
-						klient->sende((char*)&byte, 1);
-						byte = (unsigned char)(f.dataLength >> 24);
-						klient->sende((char*)&byte, 1);
-						byte = (unsigned char)(f.dataLength >> 16);
-						klient->sende((char*)&byte, 1);
-						byte = (unsigned char)(f.dataLength >> 8);
-						klient->sende((char*)&byte, 1);
-						byte = (unsigned char)f.dataLength & 0xFF;
-						klient->sende((char*)&byte, 1);
-					}
-				}
-				if (f.mask)
-				{
-					byte = (unsigned char)f.key[0];
-					klient->sende((char*)&byte, 1);
-					byte = (unsigned char)f.key[1];
-					klient->sende((char*)&byte, 1);
-					byte = (unsigned char)f.key[2];
-					klient->sende((char*)&byte, 1);
-					byte = (unsigned char)f.key[3];
-					klient->sende((char*)&byte, 1);
-				}
-				if (f.dataLength)
-				{
-					for (int i = 0; i < f.dataLength; i++)
-					{
-						if (f.mask)
-							byte = (unsigned char)f.data[i] ^ f.key[i % 4];
-						else
-							byte = (unsigned char)f.data[i];
-						klient->sende((char*)&byte, 1);
-					}
-				}
-				c2.unlock();
-				delete[] f.data;
-				c.lock();
-				queue->remove(0);
-				if (f.opcode == 0x8)
-				{
-					if (nextClose)
-					{
-						c.unlock();
-						c2.lock();
-						klient->trenne();
-						klient = (Klient*)klient->release();
-						c2.unlock();
-						return;
-					}
-					else
-					{
-						nextClose = 1;
-					}
-				}
-			}
-			c.unlock();
-		}
-	}
+    while (klient)
+    {
+        c2.lock();
+        if (!klient)
+        {
+            c2.unlock();
+            return;
+        }
+        if (klient->hatNachricht(100))
+        {
+            bool ok = 1;
+            c2.unlock();
+            bool first = 1;
+            Frame m;
+            unsigned char byte;
+            do
+            {
+                c2.lock();
+                if (!klient)
+                {
+                    c2.unlock();
+                    return;
+                }
+                Frame message;
+                ok &= klient->getNachricht((char*)&byte, 1);
+                message.fin = (byte & 0x80) != 0;
+                message.rsv1 = (byte & 0x40) != 0;
+                message.rsv2 = (byte & 0x20) != 0;
+                message.rsv3 = (byte & 0x10) != 0;
+                message.opcode = byte & 0xF;
+                ok &= klient->getNachricht((char*)&byte, 1);
+                message.mask = (byte & 0x80) != 0;
+                message.dataLength = byte & 0x7F;
+                if (message.dataLength == 126)
+                {
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength = byte << 8;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength |= byte;
+                }
+                else if (message.dataLength == 127)
+                {
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength = (__int64)byte << 56;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength |= (__int64)byte << 48;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength |= (__int64)byte << 40;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength |= (__int64)byte << 32;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength |= (__int64)byte << 24;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength |= (__int64)byte << 16;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength |= (__int64)byte << 8;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.dataLength |= (__int64)byte;
+                }
+                if (message.mask)
+                {
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.key[0] = byte;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.key[1] = byte;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.key[2] = byte;
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    message.key[3] = byte;
+                }
+                if (!ok) message.dataLength = 1;
+                message.data = 0;
+                if (message.dataLength)
+                    message.data = new char[(int)message.dataLength];
+                for (int i = 0; i < message.dataLength; i++)
+                {
+                    ok &= klient->getNachricht((char*)&byte, 1);
+                    if (message.mask)
+                        message.data[i] = byte ^ message.key[i % 4];
+                    else
+                        message.data[i] = byte;
+                }
+                c2.unlock();
+                if (first)
+                    m = message;
+                else
+                {
+                    m += message;
+                    delete[] message.data;
+                }
+                first = 0;
+                if (!ok) break;
+            } while (!m.fin);
+            if (!ok)
+            {
+                delete[] m.data;
+                return;
+            }
+            if (m.opcode == 0x9)
+            {
+                m.opcode = 0xA;
+                m.key[0] = (unsigned char)(gen.rand() * 256);
+                m.key[1] = (unsigned char)(gen.rand() * 256);
+                m.key[2] = (unsigned char)(gen.rand() * 256);
+                m.key[3] = (unsigned char)(gen.rand() * 256);
+                queue->add(m);
+            }
+            else if (m.opcode == 0xA)
+            {
+                delete[] m.data;
+            }
+            else if (m.opcode == 0x8)
+            {
+                if (nextClose)
+                {
+                    delete[] m.data;
+                    c2.lock();
+                    klient->trenne();
+                    klient = (Klient*)klient->release();
+                    c2.unlock();
+                    return;
+                }
+                else
+                {
+                    m.key[0] = (unsigned char)(gen.rand() * 256);
+                    m.key[1] = (unsigned char)(gen.rand() * 256);
+                    m.key[2] = (unsigned char)(gen.rand() * 256);
+                    m.key[3] = (unsigned char)(gen.rand() * 256);
+                    queue->add(m);
+                    nextClose = 1;
+                }
+            }
+            else if (callback)
+            {
+                callback(
+                    this, m.dataLength, m.data, m.opcode == 1 ? TEXT : BINARY);
+                delete[] m.data;
+            }
+        }
+        else
+        {
+            c2.unlock();
+            c.lock();
+            while (queue->getEintragAnzahl())
+            {
+                Frame f = queue->get(0);
+                c.unlock();
+                unsigned char byte = (f.fin ? 1 : 0) << 7;
+                byte |= (f.rsv1 ? 1 : 0) << 6;
+                byte |= (f.rsv2 ? 1 : 0) << 5;
+                byte |= (f.rsv3 ? 1 : 0) << 4;
+                byte |= f.opcode & 0xF;
+                c2.lock();
+                if (!klient)
+                {
+                    c2.unlock();
+                    return;
+                }
+                klient->sende((char*)&byte, 1);
+                byte = (f.mask ? 1 : 0) << 7;
+                if (f.dataLength < 126)
+                    byte |= (unsigned char)f.dataLength & 0x7F;
+                else if (f.dataLength <= 32767)
+                    byte |= 126;
+                else
+                    byte |= 127;
+                klient->sende((char*)&byte, 1);
+                if (f.dataLength >= 126)
+                {
+                    if (f.dataLength <= 32767)
+                    {
+                        byte = (unsigned char)(f.dataLength >> 8);
+                        klient->sende((char*)&byte, 1);
+                        byte = (unsigned char)f.dataLength & 0xFF;
+                        klient->sende((char*)&byte, 1);
+                    }
+                    else
+                    {
+                        byte = (unsigned char)(f.dataLength >> 56);
+                        klient->sende((char*)&byte, 1);
+                        byte = (unsigned char)(f.dataLength >> 48);
+                        klient->sende((char*)&byte, 1);
+                        byte = (unsigned char)(f.dataLength >> 40);
+                        klient->sende((char*)&byte, 1);
+                        byte = (unsigned char)(f.dataLength >> 32);
+                        klient->sende((char*)&byte, 1);
+                        byte = (unsigned char)(f.dataLength >> 24);
+                        klient->sende((char*)&byte, 1);
+                        byte = (unsigned char)(f.dataLength >> 16);
+                        klient->sende((char*)&byte, 1);
+                        byte = (unsigned char)(f.dataLength >> 8);
+                        klient->sende((char*)&byte, 1);
+                        byte = (unsigned char)f.dataLength & 0xFF;
+                        klient->sende((char*)&byte, 1);
+                    }
+                }
+                if (f.mask)
+                {
+                    byte = (unsigned char)f.key[0];
+                    klient->sende((char*)&byte, 1);
+                    byte = (unsigned char)f.key[1];
+                    klient->sende((char*)&byte, 1);
+                    byte = (unsigned char)f.key[2];
+                    klient->sende((char*)&byte, 1);
+                    byte = (unsigned char)f.key[3];
+                    klient->sende((char*)&byte, 1);
+                }
+                if (f.dataLength)
+                {
+                    for (int i = 0; i < f.dataLength; i++)
+                    {
+                        if (f.mask)
+                            byte = (unsigned char)f.data[i] ^ f.key[i % 4];
+                        else
+                            byte = (unsigned char)f.data[i];
+                        klient->sende((char*)&byte, 1);
+                    }
+                }
+                c2.unlock();
+                delete[] f.data;
+                c.lock();
+                queue->remove(0);
+                if (f.opcode == 0x8)
+                {
+                    if (nextClose)
+                    {
+                        c.unlock();
+                        c2.lock();
+                        klient->trenne();
+                        klient = (Klient*)klient->release();
+                        c2.unlock();
+                        return;
+                    }
+                    else
+                    {
+                        nextClose = 1;
+                    }
+                }
+            }
+            c.unlock();
+        }
+    }
 }
 
 __declspec(dllexport) void WebSocketClient::disconnect()
 {
-	if (!klient)
-		return;
-	c2.lock();
-	klient->trenne();
-	klient = (Klient*)klient->release();
-	c2.unlock();
-	warteAufThread(1000);
+    if (!klient) return;
+    c2.lock();
+    klient->trenne();
+    klient = (Klient*)klient->release();
+    c2.unlock();
+    warteAufThread(1000);
 }
 
 __declspec(dllexport) bool WebSocketClient::isConnected() const
 {
-	return klient != 0;
+    return klient != 0;
 }

+ 70 - 59
Network/WebSocket.h

@@ -1,70 +1,81 @@
 #pragma once
 
-#include <functional>
-#include <Thread.h>
 #include <Critical.h>
+#include <functional>
 #include <Random.h>
+#include <Thread.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);
-		};
+    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
-		};
+        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;
+        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;
-		};
-	}
-}
+        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;
+        };
+    } // namespace WebSocket
+} // namespace Network