ErhaltungClient.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include "ErhaltungClient.h"
  2. #include <Klient.h>
  3. #include "Keys.h"
  4. using namespace KSGClient;
  5. // Inhalt der ErhaltungClient Klasse
  6. // Konstruktor
  7. ErhaltungClient::ErhaltungClient( int klientId, unsigned short port, char *ip, char *key, unsigned char keyLen )
  8. : Thread()
  9. {
  10. ref = 1;
  11. this->ip = ip;
  12. this->port = port;
  13. cId = klientId;
  14. k = 0;
  15. this->key = new char[ keyLen ];
  16. memcpy( this->key, key, keyLen );
  17. this->keyLen = keyLen;
  18. abmel = 0;
  19. trenn = 0;
  20. }
  21. // Destruktor
  22. ErhaltungClient::~ErhaltungClient()
  23. {
  24. if( k )
  25. {
  26. abmelden();
  27. trenne();
  28. }
  29. warteAufThread( 10000 );
  30. ende();
  31. if( k )
  32. k->release();
  33. delete[] key;
  34. }
  35. // DBeantwortet Ping - Anfragen des Servers. Falls diese 60 Sekunden lang unbeantwortet bleiben, wird der Client vom Serversystem abgemeldet
  36. void ErhaltungClient::thread()
  37. {
  38. while( 1 )
  39. {
  40. char n = 0;
  41. k->getNachrichtEncrypted( &n, 1 );
  42. if( n != 1 )
  43. {
  44. Sleep( 250 );
  45. continue;
  46. }
  47. if( trenn )
  48. {
  49. if( abmel )
  50. {
  51. k->sendeEncrypted( "\1", 1 );
  52. k->getNachrichtEncrypted( &n, 1 );
  53. }
  54. k->trenne();
  55. run = 0;
  56. return;
  57. }
  58. else
  59. k->sendeEncrypted( "\0", 1 );
  60. }
  61. }
  62. // verbindet ich mit dem Erhaltung Server
  63. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  64. bool ErhaltungClient::verbinde()
  65. {
  66. cs.lock();
  67. if( k )
  68. {
  69. cs.unlock();
  70. return 1;
  71. }
  72. k = new Network::Klient();
  73. int l = 0;
  74. char *key;
  75. Keys::getServerKey( &key, l, Keys::ERHALTUNG, Keys::SENDEN );
  76. k->setSendeKey( key, l );
  77. delete[] key;
  78. Keys::getServerKey( &key, l, Keys::ERHALTUNG, Keys::EMPFANGEN );
  79. k->setEmpfangKey( key, l );
  80. delete[] key;
  81. if( k->verbinde( port, ip ) )
  82. {
  83. k->sende( "\0", 1 ); // Verschlüsselung Aktivieren
  84. if( k->sendeEncrypted( "\1", 1 ) )
  85. {
  86. k->sendeEncrypted( (char*)&cId, 4 );
  87. char serverReturn = 0;
  88. k->getNachrichtEncrypted( &serverReturn, 1 );
  89. if( serverReturn == 3 )
  90. {
  91. char byte = 0;
  92. k->getNachrichtEncrypted( &byte, 1 );
  93. char *f = new char[ byte + 1 ];
  94. f[ byte ] = 0;
  95. k->getNachrichtEncrypted( f, byte );
  96. err = "error while identifyin client Erhaltung Server returned: ";
  97. err += f;
  98. delete[]f;
  99. k->sendeEncrypted( "\3", 1 );
  100. k->getNachrichtEncrypted( &serverReturn, 1 );
  101. k->trenne();
  102. k = k->release();
  103. cs.unlock();
  104. return 0;
  105. }
  106. k->setSendeKey( this->key, this->keyLen );
  107. k->setEmpfangKey( this->key, this->keyLen );
  108. start();
  109. }
  110. else
  111. {
  112. err = "network error while sending to Erhaltung Server";
  113. k = k->release();
  114. cs.unlock();
  115. return 0;
  116. }
  117. }
  118. else
  119. {
  120. err = "network error while connecting to Erhaltung Server";
  121. k = k->release();
  122. cs.unlock();
  123. return 0;
  124. }
  125. cs.unlock();
  126. return 1;
  127. }
  128. // Meldet sich beim Server ab und trennt die Verbindung
  129. void ErhaltungClient::abmelden()
  130. {
  131. abmel = 1;
  132. }
  133. // Trennt die Verbindung zum Server
  134. // Gibt 1 zurück, falls der Vorgang erfolgreich ist, 0 sonnst
  135. // Sollte erst nach einem erfolgreichen Aufruf von verbinde aufgerufen werden
  136. bool ErhaltungClient::trenne()
  137. {
  138. trenn = 1;
  139. return 1;
  140. }
  141. // gibt den Letzten Fehlertext zuück
  142. // sollte erst aufgerufen werden, nachdem eine andere aufgerufene Methode fehlgeschlagen ist
  143. char *ErhaltungClient::getLetzterFehler() const
  144. {
  145. return err;
  146. }
  147. // Erhöht den Reference Counter um 1 un gibt this zurück
  148. ErhaltungServerClient *ErhaltungClient::getThis()
  149. {
  150. ref++;
  151. return this;
  152. }
  153. // Verringert den Reference Counter um 1 und gibt 0 zurück.
  154. // Falls der Reference Counter nach dem Aufruf auf 0 ist löscht sich das Objekt selbst
  155. ErhaltungServerClient *ErhaltungClient::release()
  156. {
  157. if( !--ref )
  158. delete this;
  159. return 0;
  160. }