ErhaltungClient.cpp 4.1 KB

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