Browse Source

Bessere Interfacestruktur für Netzwerkverbindungen und implementierungen für StreamReader und StreamWriter für Netzwerkverbindungen hinzugefügt

Kolja Strohm 3 years ago
parent
commit
8a72ce9bb9
7 changed files with 270 additions and 38 deletions
  1. 2 2
      Network Linux.vcxproj
  2. 8 8
      Network/Klient.h
  3. 160 20
      Network/Network.cpp
  4. 92 0
      Network/Network.h
  5. 8 8
      Network/Server.h
  6. BIN
      libNetwork.so
  7. BIN
      libdbgNetwork.so

+ 2 - 2
Network Linux.vcxproj

@@ -40,7 +40,7 @@
     <TargetName>libdbgNetwork</TargetName>
     <TargetExt>.so</TargetExt>
     <RemoteProjectDir>$(RemoteRootDir)/Network/debug</RemoteProjectDir>
-    <IncludePath>..\Framework;$(IncludePath);$(ISenseIncludePath);../Framework/release</IncludePath>
+    <IncludePath>..\Framework;$(IncludePath);$(ISenseIncludePath);../../Framework/release</IncludePath>
     <OutDir>$(RemoteRootDir)/Network/debug/</OutDir>
     <IntDir>$(RemoteRootDir)/Network/debug/</IntDir>
     <RemoteTargetPath>$(RemoteProjectDir)/$(TargetName)$(TargetExt)</RemoteTargetPath>
@@ -48,7 +48,7 @@
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <RemoteProjectDir>$(RemoteRootDir)/Network/release</RemoteProjectDir>
     <TargetExt>.so</TargetExt>
-    <IncludePath>..\Framework;$(IncludePath);$(ISenseIncludePath);../Framework/release</IncludePath>
+    <IncludePath>..\Framework;$(IncludePath);$(ISenseIncludePath);../../Framework/release</IncludePath>
     <TargetName>libNetwork</TargetName>
     <OutDir>$(RemoteRootDir)/Network/release/</OutDir>
     <IntDir>$(RemoteRootDir)/Network/release/</IntDir>

+ 8 - 8
Network/Klient.h

@@ -25,7 +25,7 @@ namespace Network
 {
 	class Klient; // aus dieser Datei
 
-	class Klient
+	class Klient : public EncryptedVerbindung
 	{
 	private:
 		SOCKET sock;
@@ -47,10 +47,10 @@ namespace Network
 		__declspec( dllexport ) void setSendeKey( char *key, int len ); // Setzt den Schlüssel fürs Senden
 		__declspec( dllexport ) void setEmpfangKey( 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 ); // sendet zum Server
-		__declspec( dllexport ) bool getNachricht( char *nachricht, int len ); // empfängt Nachricht
-		__declspec( dllexport ) bool sendeEncrypted( const char *nachricht, int len ); // sendet zum Server
-		__declspec( dllexport ) bool getNachrichtEncrypted( char *nachricht, int len ); // empfängt Nachricht
+		__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
@@ -63,7 +63,7 @@ namespace Network
 		__declspec( dllexport ) Klient *release();
 	};
 
-    class SSLKlient
+    class SSLKlient : public Verbindung
     {
     private:
         unsigned short port;
@@ -82,8 +82,8 @@ namespace Network
         // 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 ); // sendet zum Server
-        __declspec( dllexport ) bool getNachricht( char *nachricht, int len ); // empfängt Nachricht
+        __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

+ 160 - 20
Network/Network.cpp

@@ -7,16 +7,17 @@
 #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 )
+        MessageBox( 0, "Win Sock 2.0 konnte nocht gestartet werden.", "Fehler", MB_ICONERROR );
 #else
     signal( SIGPIPE, SIG_IGN );
 #endif
@@ -26,26 +27,27 @@ void Network::Start( int maxClients )
 
 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 )
-	{
+    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 );
+        MessageBox( 0, "Die Ip Addresse konnte nicht ermittelt werden.", "Fehler", MB_ICONERROR );
 #else
-		std::cout << "Fehler: Die Ip Addresse konnte nicht ermittelt werden.";
+        std::cout << "Fehler: Die Ip Addresse konnte nicht ermittelt werden.";
 #endif
-	}
-	addresse = inet_ntoa( *( struct in_addr* )*hostinfo->h_addr_list );
-	return addresse;
+        return 0;
+    }
+    addresse = inet_ntoa( *(struct in_addr *)*hostinfo->h_addr_list );
+    return addresse;
 }
 
 
@@ -53,6 +55,144 @@ char *Network::getHostAddresse()
 void Network::Exit()
 {
 #ifdef WIN32
-	WSACleanup();
+    WSACleanup();
 #endif
-}
+}
+
+
+Network::NetworkReader::NetworkReader( Verbindung *v )
+{
+    verbindung = 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
+void Network::NetworkReader::lese( char *bytes, int 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;
+}
+
+//! 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;
+}
+
+
+Network::NetworkWriter::NetworkWriter( 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
+void Network::NetworkWriter::schreibe( const char *bytes, int 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;
+}
+
+
+Network::EncryptedNetworkReader::EncryptedNetworkReader( EncryptedVerbindung *v )
+{
+    verbindung = 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
+void Network::EncryptedNetworkReader::lese( char *bytes, int 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;
+}
+
+//! 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;
+}
+
+
+Network::EncryptedNetworkWriter::EncryptedNetworkWriter( EncryptedVerbindung *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
+void Network::EncryptedNetworkWriter::schreibe( const char *bytes, int 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;
+}

+ 92 - 0
Network/Network.h

@@ -32,6 +32,13 @@
 #define PHOSTENT          hostent*
 #endif
 #endif
+#include <Reader.h>
+#include <Writer.h>
+
+namespace Framework
+{
+	class Text;
+}
 
 namespace Network
 {
@@ -39,6 +46,91 @@ namespace Network
 	__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 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;
+
+	public:
+		NetworkReader( Verbindung *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
+		void lese( char *bytes, int len ) override;
+		//! Ließt die nächste zeile der Resource ein
+		//! \return Die gelesene Zeile als Text mit zeilenumbruch
+		Framework::Text *leseZeile() override;
+		//! Prüft, ob die Resource vollständig gelesen wurde
+		//!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+		bool istEnde() const override;
+	};
+
+	class NetworkWriter : public Framework::StreamWriter
+	{
+	private:
+		Verbindung *verbindung;
+
+	public:
+		NetworkWriter( 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
+		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
+		bool istEnde() const override;
+	};
+
+	class EncryptedNetworkReader : public Framework::StreamReader
+	{
+	private:
+		EncryptedVerbindung *verbindung;
+
+	public:
+		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
+		void lese( char *bytes, int len ) override;
+		//! Ließt die nächste zeile der Resource ein
+		//! \return Die gelesene Zeile als Text mit zeilenumbruch
+		Framework::Text *leseZeile() override;
+		//! Prüft, ob die Resource vollständig gelesen wurde
+		//!  return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
+		bool istEnde() const override;
+	};
+
+	class EncryptedNetworkWriter : public Framework::StreamWriter
+	{
+	private:
+		EncryptedVerbindung *verbindung;
+
+	public:
+		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
+		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
+		bool istEnde() const override;
+	};
 }
 
 #endif

+ 8 - 8
Network/Server.h

@@ -50,7 +50,7 @@ namespace Network
 		__declspec( dllexport ) Server *release();
 	};
 
-	class SKlient
+	class SKlient : public EncryptedVerbindung
 	{
 	private:
 		SOCKET sock;
@@ -71,10 +71,10 @@ namespace Network
 		__declspec( dllexport ) void setEmpfangKeyZ( Encryption::Key *key ); // Setzt den Schlüssel fürs Empfangen
 		__declspec( dllexport ) void setSendeKey( char *key, int len ); // Setzt den Schlüssel fürs Senden
 		__declspec( dllexport ) void setEmpfangKey( char *key, int len ); // Setzt den Schlüssel fürs Empfangen
-		__declspec( dllexport ) bool sende( const char *nachricht, int len ); // sendet zum Klient
-		__declspec( dllexport ) bool getNachricht( char *nachricht, int len ); // empfängt Nachricht von Klient
-		__declspec( dllexport ) bool sendeEncrypted( const char *nachricht, int len ); // sendet zum Server
-		__declspec( dllexport ) bool getNachrichtEncrypted( char *nachricht, int len ); // empfängt Nachricht
+		__declspec( dllexport ) bool sende( const char *nachricht, int len ) override; // sendet zum Klient
+		__declspec( dllexport ) bool getNachricht( char *nachricht, int len ) override; // empfängt Nachricht von Klient
+		__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 Klient
@@ -128,7 +128,7 @@ namespace Network
         __declspec( dllexport ) SSLServer *release();
     };
 
-    class SSLSKlient
+    class SSLSKlient : public Verbindung
     {
     private:
         SOCKET s;
@@ -144,8 +144,8 @@ namespace Network
         // Destruktor 
         __declspec( dllexport ) ~SSLSKlient();
         // nicht constant 
-        __declspec( dllexport ) bool sende( const char *nachricht, int len ); // sendet zum Klient
-        __declspec( dllexport ) bool getNachricht( char *nachricht, int len ); // empfängt Nachricht von Klient
+        __declspec( dllexport ) bool sende( const char *nachricht, int len ) override; // sendet zum Klient
+        __declspec( dllexport ) bool getNachricht( char *nachricht, int len ) override; // empfängt Nachricht von Klient
         __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 Klient

BIN
libNetwork.so


BIN
libdbgNetwork.so