ErhaltungClient.cpp 3.1 KB

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