Просмотр исходного кода

add method to wait for the next message withour reading it

Kolja Strohm 3 лет назад
Родитель
Сommit
3d9a9023d4
4 измененных файлов с 77 добавлено и 56 удалено
  1. 30 21
      Network/Klient.cpp
  2. 35 34
      Network/Klient.h
  3. 11 1
      Network/Server.cpp
  4. 1 0
      Network/Server.h

+ 30 - 21
Network/Klient.cpp

@@ -37,35 +37,35 @@ Klient::~Klient()
 }
 
 // nicht constant 
-void Klient::setSendeKeyZ( Encryption::Key *key ) // Setzt den Key fürs Senden
+void Klient::setSendeKeyZ( Encryption::Key* key ) // Setzt den Key fürs Senden
 {
     if( sendeKey )
         sendeKey->release();
     sendeKey = key;
 }
 
-void Klient::setEmpfangKeyZ( Encryption::Key *key ) // Setzt den Key fürs Empfangen
+void Klient::setEmpfangKeyZ( Encryption::Key* key ) // Setzt den Key fürs Empfangen
 {
     if( empfangKey )
         empfangKey->release();
     empfangKey = key;
 }
 
-void Klient::setSendeKey( char *key, int len ) // Setzt den Key fürs Senden
+void Klient::setSendeKey( char* key, int len ) // Setzt den Key fürs Senden
 {
     if( !sendeKey )
         sendeKey = new Encryption::Key();
     sendeKey->setKey( key, len );
 }
 
-void Klient::setEmpfangKey( char *key, int len ) // Setzt den Key fürs Empfangen
+void Klient::setEmpfangKey( char* key, int len ) // Setzt den Key fürs Empfangen
 {
     if( !empfangKey )
         empfangKey = new Encryption::Key();
     empfangKey->setKey( key, len );
 }
 
-bool Klient::verbinde( unsigned short port, const char *ip ) // verbindet mit Server
+bool Klient::verbinde( unsigned short port, const char* ip ) // verbindet mit Server
 {
     if( sendeKey )
         sendeKey->setPos( 0 );
@@ -77,19 +77,19 @@ bool Klient::verbinde( unsigned short port, const char *ip ) // verbindet mit Se
     long sIp = inet_addr( ip ); // ip addresse
     if( sIp == INADDR_NONE )
     {
-        struct hostent *pHostInfo = gethostbyname( ip );
+        struct hostent* pHostInfo = gethostbyname( ip );
         if( pHostInfo == 0 )
             return 0;
-        sIp = *(long *)pHostInfo->h_addr_list[ 0 ];
+        sIp = *(long*)pHostInfo->h_addr_list[ 0 ];
     }
-    memcpy( (char *)&server.sin_addr, &sIp, sizeof( sIp ) );
+    memcpy( (char*)&server.sin_addr, &sIp, sizeof( sIp ) );
     server.sin_port = htons( port ); // port
-    if( connect( sock, (struct sockaddr *)&server, sizeof( server ) ) < 0 ) // verbinden
+    if( connect( sock, (struct sockaddr*)&server, sizeof( server ) ) < 0 ) // verbinden
         return 0; // Fehler
     return 1;
 }
 
-bool Klient::sende( const char *nachricht, int len ) // sendet zum Server
+bool Klient::sende( const char* nachricht, int len ) // sendet zum Server
 {
     int ll = 0;
     while( len > 0 )
@@ -108,7 +108,7 @@ bool Klient::sende( const char *nachricht, int len ) // sendet zum Server
     return 1;
 }
 
-bool Klient::getNachricht( char *nachricht, int len ) // empfängt Nachricht
+bool Klient::getNachricht( char* nachricht, int len ) // empfängt Nachricht
 {
     int ll = 0;
     while( len > 0 )
@@ -123,12 +123,12 @@ bool Klient::getNachricht( char *nachricht, int len ) // empf
     return 1;
 }
 
-bool Klient::sendeEncrypted( const char *nachricht, int len ) // sendet zum Server
+bool Klient::sendeEncrypted( const char* nachricht, int len ) // sendet zum Server
 {
     if( !sendeKey )
         return sende( nachricht, len );
-    Encryption::Bytes *n = new Encryption::Bytes( nachricht, len );
-    sendeKey->codieren( dynamic_cast<Framework::Encryption::Bytes *>( n->getThis() ) );
+    Encryption::Bytes* n = new Encryption::Bytes( nachricht, len );
+    sendeKey->codieren( dynamic_cast<Framework::Encryption::Bytes*>(n->getThis()) );
     int ll = 0;
     while( len > 0 )
     {
@@ -150,7 +150,7 @@ bool Klient::sendeEncrypted( const char *nachricht, int len ) // sendet zum Serv
     return 1;
 }
 
-bool Klient::getNachrichtEncrypted( char *nachricht, int len ) // empfängt Nachricht
+bool Klient::getNachrichtEncrypted( char* nachricht, int len ) // empfängt Nachricht
 {
     if( !empfangKey )
         return getNachricht( nachricht, len );
@@ -163,7 +163,7 @@ bool Klient::getNachrichtEncrypted( char *nachricht, int len ) // empf
         len -= l;
         ll += l;
     }
-    Encryption::Bytes *n = new Encryption::Bytes();
+    Encryption::Bytes* n = new Encryption::Bytes();
     n->setBytesZ( nachricht, ll );
     empfangKey->decodieren( n );
     downStreamBytes += ll;
@@ -215,11 +215,20 @@ unsigned short Klient::getServerPort() const // gibt den Port zur
     return htons( server.sin_port );
 }
 
-const char *Klient::getServerIp() const // gibt die Ip zurück
+const char* Klient::getServerIp() const // gibt die Ip zurück
 {
     return inet_ntoa( server.sin_addr );
 }
 
+bool Klient::waitForNextMessage() const // wartet bis es etwas zu empfangen gibt
+{
+    char c;
+    int l = (int)recv( sock, &c, 1, MSG_WAITALL | MSG_PEEK );
+    if( l <= 0 )
+        return 0; // Fehler
+    return 1;
+}
+
 
 // Inhalt der SSLKlient Klasse aus Klient.h
         // Konstruktor 
@@ -252,7 +261,7 @@ SSLKlient::~SSLKlient()
 #endif
 }
 
-bool SSLKlient::verbinde( unsigned short port, const char *ip ) // verbindet mit Server
+bool SSLKlient::verbinde( unsigned short port, const char* ip ) // verbindet mit Server
 {
     this->port = port;
     if( this->ip )
@@ -268,7 +277,7 @@ bool SSLKlient::verbinde( unsigned short port, const char *ip ) // verbindet mit
     return connected;
 }
 
-bool SSLKlient::sende( const char *nachricht, int len ) // sendet zum Server
+bool SSLKlient::sende( const char* nachricht, int len ) // sendet zum Server
 {
     int ll = 0;
     while( len > 0 )
@@ -283,7 +292,7 @@ bool SSLKlient::sende( const char *nachricht, int len ) // sendet zum Server
     return 1;
 }
 
-bool SSLKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht
+bool SSLKlient::getNachricht( char* nachricht, int len ) // empfängt Nachricht
 {
     if( !connected )
         return 0;
@@ -338,7 +347,7 @@ unsigned short SSLKlient::getServerPort() const // gibt den Port des Servers zur
     return port;
 }
 
-const char *SSLKlient::getServerIp() const // gibt die Ip des Servers zurück
+const char* SSLKlient::getServerIp() const // gibt die Ip des Servers zurück
 {
     return ip->getText();
 }

+ 35 - 34
Network/Klient.h

@@ -31,62 +31,63 @@ namespace Network
     private:
         SOCKET sock;
         sockaddr_in server;
-        Encryption::Key *sendeKey;
-        Encryption::Key *empfangKey;
+        Encryption::Key* sendeKey;
+        Encryption::Key* empfangKey;
         int downStreamBytes;
         int upStreamBytes;
 
     public:
         // Konstruktor 
-        __declspec( dllexport ) Klient();
+        __declspec(dllexport) Klient();
         // Destruktor 
-        __declspec( dllexport ) ~Klient();
+        __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( 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 ) 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
+        __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( 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 ) 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 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
     };
 
     class SSLKlient : public Verbindung, public virtual ReferenceCounter
     {
     private:
         unsigned short port;
-        Text *ip;
-        SSL_CTX *ctx;
-        SSL *ssl;
-        BIO *bio;
+        Text* ip;
+        SSL_CTX* ctx;
+        SSL* ssl;
+        BIO* bio;
         int downStreamBytes;
         int upStreamBytes;
         bool connected;
 
     public:
         // Konstruktor 
-        __declspec( dllexport ) SSLKlient();
+        __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
+        __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
+        __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
     };
 }
 

+ 11 - 1
Network/Server.cpp

@@ -320,7 +320,7 @@ bool SSLErrorCheck( int result, SSL* ssl, const char* action )
     return 1;
 }
 
-bool SSLErrorCheck( int result, const char* action )
+bool SSLErrorCheck( __int64 result, const char* action )
 {
     if( result <= 0 )
     {
@@ -332,6 +332,16 @@ bool SSLErrorCheck( int result, const char* action )
     return 1;
 }
 
+bool SKlient::waitForNextMessage() const // wartet bis es etwas zu empfangen gibt
+{
+    char c;
+    int l = (int)recv( sock, &c, 1, (empfangTimeout ? 0 : MSG_WAITALL) | MSG_PEEK );
+    if( l <= 0 )
+        return 0; // Fehler
+    return 1;
+}
+
+
 // Inhalt der SSLServer Klasse
 // Konstruktor 
 SSLServer::SSLServer()

+ 1 - 0
Network/Server.h

@@ -80,6 +80,7 @@ namespace Network
         __declspec(dllexport) bool hatNachricht( int zeit ) const; // Wartet eine Zeit Lang auf eine Nachricht
         __declspec(dllexport) unsigned short getPort() const; // gibt den Port zurück
         __declspec(dllexport) const char* getIp() const; // gibt die Ip des Klients zurück
+        __declspec(dllexport) bool waitForNextMessage() const; // wartet bis es etwas zu empfangen gibt
     };
 
     class SSLSKlient;