SpielServer.cpp 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755
  1. #include "SpielServer.h"
  2. #include <iostream>
  3. #include <Zeit.h>
  4. #include <Klient.h>
  5. #include <Globals.h>
  6. #ifdef WIN32
  7. #include "..\Datenbank\Datenbank.h"
  8. #else
  9. #include "Datenbank.h"
  10. #endif
  11. // Inhalt der SpielServer Klasse aus SpielServer.h
  12. // Konstruktor
  13. SpielServer::SpielServer(InitDatei* zIni)
  14. : Thread()
  15. {
  16. Network::Start(100);
  17. std::cout << "SS: Verbindung mit Datenbank wird hergestellt...\n";
  18. db = new SSDatenbank(zIni);
  19. empfangen = 0;
  20. gesendet = 0;
  21. fehler = new Text();
  22. ini = dynamic_cast<InitDatei*>(zIni->getThis());
  23. id = (int)*zIni->zWert("ServerId");
  24. server = new Server();
  25. aServer = new SSLServer();
  26. aServer->setPrivateKeyPassword(zIni->zWert("SSLPasswort")->getText());
  27. aServer->setCertificateFile(zIni->zWert("SSLCert")->getText());
  28. aServer->setPrivateKeyFile(zIni->zWert("SSLKey")->getText());
  29. std::cout << "SS: Starten des Admin Servers...\n";
  30. if (!aServer->verbinde((unsigned short)TextZuInt(ini->zWert("AdminServerPort")->getText(), 10), 10))
  31. {
  32. std::cout << "SS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  33. exit(1);
  34. }
  35. db->setServerStatus(id, 2);
  36. end = 0;
  37. nichtPausiert = 0;
  38. InitializeCriticalSection(&cs);
  39. startSpielThread = new SpielFinden(this);
  40. if (zIni->zWert("Aktiv")->istGleich("TRUE"))
  41. {
  42. serverStarten();
  43. serverFortsetzen();
  44. }
  45. erstellt = new RCArray< SpielErstellt >();
  46. spiele = new RCArray< Spiel >();
  47. klients = new RCArray< SSKlient >();
  48. spielHistorieId = new Array< int >();
  49. historieS = new HistorieSender(this);
  50. historieS->start();
  51. }
  52. // Destruktor
  53. SpielServer::~SpielServer()
  54. {
  55. historieS->setEnde();
  56. historieS->warteAufThread(20000);
  57. historieS->ende();
  58. historieS->release();
  59. fehler->release();
  60. server->trenne();
  61. server->release();
  62. aServer->trenne();
  63. aServer->release();
  64. ini->release();
  65. db->release();
  66. DeleteCriticalSection(&cs);
  67. startSpielThread->release();
  68. erstellt->release();
  69. spiele->release();
  70. if (klients)
  71. klients->release();
  72. spielHistorieId->release();
  73. }
  74. // nicht constant
  75. void SpielServer::lock()
  76. {
  77. EnterCriticalSection(&cs);
  78. }
  79. void SpielServer::unlock()
  80. {
  81. LeaveCriticalSection(&cs);
  82. }
  83. void SpielServer::runn()
  84. {
  85. while (!end && aServer->isConnected())
  86. {
  87. SSLSKlient* klient;
  88. klient = aServer->getKlient();
  89. if (end && klient)
  90. {
  91. klient->trenne();
  92. klient = (SSLSKlient*)klient->release();
  93. Sleep(1000);
  94. return;
  95. }
  96. if (!klient)
  97. continue;
  98. SSAKlient* slHandle = new SSAKlient(klient, dynamic_cast<SpielServer*>(getThis()));
  99. slHandle->start();
  100. }
  101. }
  102. void SpielServer::thread()
  103. {
  104. while (server->isConnected())
  105. {
  106. SKlient* klient;
  107. klient = server->getKlient();
  108. if (!klient)
  109. continue;
  110. Framework::getThreadRegister()->cleanUpClosedThreads();
  111. SSKlient* slHandle = new SSKlient(klient, dynamic_cast<SpielServer*>(getThis()));
  112. slHandle->start();
  113. }
  114. }
  115. void SpielServer::close()
  116. {
  117. db->setServerStatus(id, 1);
  118. server->trenne();
  119. #ifdef WIN32
  120. warteAufThread(1000);
  121. #endif
  122. lock();
  123. for (int i = 0; i < klients->getEintragAnzahl(); i++)
  124. klients->z(i)->absturz();
  125. if (klients)
  126. klients = (RCArray<SSKlient>*) klients->release();
  127. unlock();
  128. ende();
  129. run = 0;
  130. end = 1;
  131. Klient* klient = new Klient();
  132. klient->verbinde(aServer->getPort(), "127.0.0.1");
  133. Sleep(500);
  134. aServer->trenne();
  135. klient->release();
  136. }
  137. bool SpielServer::serverStarten()
  138. {
  139. if (nichtPausiert)
  140. {
  141. fehler->setText("Der Server konnte nicht gestartet werden: Der Server läuft bereits.");
  142. return 0;
  143. }
  144. if (server)
  145. server->release();
  146. server = new Server();
  147. if (server->verbinde((unsigned short)TextZuInt(ini->zWert("ServerPort")->getText(), 10), 10))
  148. {
  149. nichtPausiert = 1;
  150. start();
  151. startSpielThread->setSpielServerId(id);
  152. startSpielThread->start();
  153. return 1;
  154. }
  155. else
  156. {
  157. serverBeenden();
  158. fehler->setText("Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung.");
  159. return 0;
  160. }
  161. }
  162. bool SpielServer::serverPause()
  163. {
  164. if (!nichtPausiert)
  165. {
  166. fehler->setText("Der Server konnte nicht pausiert werden: Der Server läuft nicht.");
  167. return 0;
  168. }
  169. if (!db->setServerStatus(id, 2))
  170. {
  171. fehler->setText("Der Server konnte nicht pausiert werden: ");
  172. fehler->append(db->getLetzterFehler());
  173. return 0;
  174. }
  175. return 1;
  176. }
  177. bool SpielServer::serverFortsetzen()
  178. {
  179. if (!nichtPausiert)
  180. {
  181. fehler->setText("Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht.");
  182. return 0;
  183. }
  184. if (!db->setServerStatus(id, 3))
  185. {
  186. fehler->setText("Der Server konnte nicht fortgesetzt werden: ");
  187. fehler->append(db->getLetzterFehler());
  188. return 0;
  189. }
  190. return 1;
  191. }
  192. bool SpielServer::serverBeenden()
  193. {
  194. if (!nichtPausiert)
  195. {
  196. fehler->setText("Der Server konnte nicht beendet werden: Der Server läuft nicht.");
  197. return 0;
  198. }
  199. if (db->serverIstNichtPausiert(id))
  200. {
  201. fehler->setText("Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden.");
  202. return 0;
  203. }
  204. startSpielThread->setEnde();
  205. startSpielThread->warteAufThread(2000);
  206. startSpielThread->ende();
  207. nichtPausiert = 0;
  208. ende();
  209. if (server)
  210. server->trenne();
  211. return 1;
  212. }
  213. bool SpielServer::setMaxSpiele(int ms)
  214. {
  215. if (!db->setMaxSpiele(id, ms))
  216. {
  217. fehler->setText("Die maximale Anzahl der Spiele konnte nicht gesetzt werden:\n");
  218. fehler->append(db->getLetzterFehler());
  219. return 0;
  220. }
  221. ini->setWert("MaxSpiele", Text() += ms);
  222. return 1;
  223. }
  224. void SpielServer::addSpielErstellt(SpielErstellt* erstellt)
  225. {
  226. lock();
  227. this->erstellt->add(erstellt);
  228. unlock();
  229. }
  230. void SpielServer::SpielErstelltAbbruch(int spielErstelltId)
  231. {
  232. lock();
  233. for (int i = 0; i < erstellt->getEintragAnzahl(); i++)
  234. {
  235. if (erstellt->z(i)->getId() == spielErstelltId)
  236. {
  237. erstellt->z(i)->abbruch();
  238. break;
  239. }
  240. }
  241. unlock();
  242. }
  243. void SpielServer::removeSpielErstellt(int id)
  244. {
  245. lock();
  246. bool gefunden = 0;
  247. for (int i = 0; i < erstellt->getEintragAnzahl(); i++)
  248. {
  249. if (erstellt->z(i)->getId() == id)
  250. {
  251. SpielErstellt* zse = erstellt->get(i);
  252. erstellt->remove(i);
  253. unlock();
  254. zse->release();
  255. gefunden = 1;
  256. break;
  257. }
  258. }
  259. if (!gefunden)
  260. unlock();
  261. }
  262. bool SpielServer::registerKlient(SSKlient* klient)
  263. {
  264. lock();
  265. bool gefunden = 0;
  266. for (int i = 0; i < klients->getEintragAnzahl(); i++)
  267. {
  268. SSKlient* tmp = klients->z(i);
  269. if (tmp)
  270. {
  271. if (tmp->getAccountId() == klient->getAccountId())
  272. {
  273. klient->getThis();
  274. tmp->setSenden(klient);
  275. klient->release();
  276. gefunden = 1;
  277. unlock();
  278. return 1;
  279. }
  280. }
  281. }
  282. if (!gefunden)
  283. klients->add(klient);
  284. unlock();
  285. return 0;
  286. }
  287. bool SpielServer::absturzKlient(int klientId)
  288. {
  289. lock();
  290. SSKlient* zKlient = 0;
  291. for (int i = 0; i < klients->getEintragAnzahl(); i++)
  292. {
  293. if (klients->z(i)->getKlientNummer() == klientId)
  294. {
  295. zKlient = klients->z(i);
  296. break;
  297. }
  298. }
  299. if (!zKlient)
  300. {
  301. unlock();
  302. return 0;
  303. }
  304. int id = 0;
  305. int ak = db->getAktionForKlient(this->id, zKlient->getAccountId(), &id);
  306. switch (ak)
  307. {
  308. case 0: // Information Über Verwendung des Klient ist verlorengegangen (überall abmelden)
  309. for (int i = 0; i < erstellt->getEintragAnzahl(); i++)
  310. {
  311. SpielErstellt* tmp = erstellt->z(i);
  312. if (tmp)
  313. tmp->klientGetrennt(zKlient);
  314. }
  315. for (int i = 0; i < spiele->getEintragAnzahl(); i++)
  316. {
  317. Spiel* tmp = spiele->z(i);
  318. if (tmp)
  319. tmp->klientGetrennt(zKlient);
  320. }
  321. break;
  322. case 1: // Spiel Erstellt
  323. for (int i = 0; i < erstellt->getEintragAnzahl(); i++)
  324. {
  325. SpielErstellt* tmp = erstellt->z(i);
  326. if (tmp)
  327. {
  328. if (tmp->getId() == id)
  329. {
  330. tmp->klientGetrennt(zKlient);
  331. break;
  332. }
  333. }
  334. }
  335. break;
  336. case 2: // Spielt
  337. for (int i = 0; i < spiele->getEintragAnzahl(); i++)
  338. {
  339. Spiel* tmp = spiele->z(i);
  340. if (tmp && tmp->getId() == id)
  341. {
  342. tmp->klientGetrennt(zKlient);
  343. break;
  344. }
  345. }
  346. break;
  347. }
  348. bool gefunden = 0;
  349. for (int i = 0; i < klients->getEintragAnzahl(); i++)
  350. {
  351. if (klients->z(i) == zKlient)
  352. {
  353. zKlient->absturz();
  354. zKlient->getThis();
  355. klients->remove(i);
  356. unlock();
  357. zKlient->release();
  358. gefunden = 1;
  359. break;
  360. }
  361. }
  362. if (!gefunden)
  363. unlock();
  364. return 1;
  365. }
  366. bool SpielServer::verteileKlient(SSKlient* klient)
  367. {
  368. lock();
  369. int id = 0;
  370. int ak = db->getAktionForKlient(this->id, klient->getAccountId(), &id);
  371. switch (ak)
  372. {
  373. case 0: // Keine Verwendung für den Klient
  374. unlock();
  375. return 0;
  376. break;
  377. case 1: // Spiel Erstellt
  378. for (int i = 0; i < erstellt->getEintragAnzahl(); i++)
  379. {
  380. SpielErstellt* tmp = erstellt->z(i);
  381. if (tmp)
  382. {
  383. if (tmp->getId() == id)
  384. {
  385. tmp->klientVerbunden(dynamic_cast<SSKlient*>(klient->getThis()));
  386. unlock();
  387. return 1;
  388. }
  389. }
  390. }
  391. break;
  392. case 2: // Spielt
  393. for (int i = 0; i < spiele->getEintragAnzahl(); i++)
  394. {
  395. Spiel* tmp = spiele->z(i);
  396. if (tmp)
  397. {
  398. if (tmp->getId() == id)
  399. {
  400. tmp->klientVerbunden(dynamic_cast<SSKlient*>(klient->getThis()));
  401. unlock();
  402. return 1;
  403. }
  404. }
  405. }
  406. break;
  407. }
  408. unlock();
  409. return 0;
  410. }
  411. void SpielServer::unregisterKlient(SSKlient* zKlient)
  412. {
  413. lock();
  414. int id = 0;
  415. int ak = db->getAktionForKlient(this->id, zKlient->getAccountId(), &id);
  416. switch (ak)
  417. {
  418. case 0: // Information Über Verwendung des Klient ist verlorengegangen (überall abmelden)
  419. for (int i = 0; i < erstellt->getEintragAnzahl(); i++)
  420. {
  421. SpielErstellt* tmp = erstellt->z(i);
  422. if (tmp)
  423. tmp->klientGetrennt(zKlient);
  424. }
  425. for (int i = 0; i < spiele->getEintragAnzahl(); i++)
  426. {
  427. Spiel* tmp = spiele->z(i);
  428. if (tmp)
  429. tmp->klientGetrennt(zKlient);
  430. }
  431. break;
  432. case 1: // Spiel Erstellt
  433. for (int i = 0; i < erstellt->getEintragAnzahl(); i++)
  434. {
  435. SpielErstellt* tmp = erstellt->z(i);
  436. if (tmp)
  437. {
  438. if (tmp->getId() == id)
  439. {
  440. tmp->klientGetrennt(zKlient);
  441. break;
  442. }
  443. }
  444. }
  445. break;
  446. case 2: // Spielt
  447. for (int i = 0; i < spiele->getEintragAnzahl(); i++)
  448. {
  449. Spiel* tmp = spiele->z(i);
  450. if (tmp && tmp->getId() == id)
  451. {
  452. tmp->klientGetrennt(zKlient);
  453. break;
  454. }
  455. }
  456. break;
  457. }
  458. bool gefunden = 0;
  459. for (int i = 0; i < klients->getEintragAnzahl(); i++)
  460. {
  461. if (klients->z(i) == zKlient)
  462. {
  463. zKlient->getThis();
  464. klients->remove(i);
  465. unlock();
  466. zKlient->release();
  467. gefunden = 1;
  468. break;
  469. }
  470. }
  471. if (!gefunden)
  472. {
  473. unlock();
  474. zKlient->release();
  475. }
  476. }
  477. void SpielServer::klientsMM(SSKlient* k)
  478. {
  479. lock();
  480. for (int i = 0; i < klients->getEintragAnzahl(); i++)
  481. {
  482. if (klients->z(i) == k)
  483. {
  484. klients->z(i)->getThis();
  485. klients->z(i)->getThis();
  486. klients->remove(i);
  487. }
  488. }
  489. unlock();
  490. }
  491. void SpielServer::addSpiel(Spiel* spiel)
  492. {
  493. lock();
  494. spiele->add(spiel);
  495. unlock();
  496. }
  497. void SpielServer::removeSpiel(int spielId)
  498. {
  499. lock();
  500. bool gefunden = 0;
  501. for (int i = 0; i < spiele->getEintragAnzahl(); i++)
  502. {
  503. if (spiele->z(i) && spiele->z(i)->getId() == spielId)
  504. {
  505. Spiel* zs = spiele->get(i);
  506. spiele->remove(i);
  507. unlock();
  508. zs->release();
  509. gefunden = 1;
  510. break;
  511. }
  512. }
  513. if (!gefunden)
  514. unlock();
  515. }
  516. void SpielServer::addGesendet(int bytes)
  517. {
  518. gesendet += bytes;
  519. }
  520. void SpielServer::addEmpfangen(int bytes)
  521. {
  522. empfangen += bytes;
  523. }
  524. void SpielServer::addSpielHistorieId(int id)
  525. {
  526. lock();
  527. spielHistorieId->add(id);
  528. unlock();
  529. }
  530. bool SpielServer::hatSpielHistorieId(int id)
  531. {
  532. bool ret = 0;
  533. lock();
  534. int anz = spielHistorieId->getEintragAnzahl();
  535. for (int i = 0; i < anz; i++)
  536. {
  537. if (spielHistorieId->hat(i) && spielHistorieId->get(i) == id)
  538. {
  539. ret = 1;
  540. break;
  541. }
  542. }
  543. unlock();
  544. return ret;
  545. }
  546. void SpielServer::removeSpielHistorieId(int id)
  547. {
  548. lock();
  549. int anz = spielHistorieId->getEintragAnzahl();
  550. for (int i = 0; i < anz; i++)
  551. {
  552. if (spielHistorieId->hat(i) && spielHistorieId->get(i) == id)
  553. {
  554. spielHistorieId->remove(i);
  555. break;
  556. }
  557. }
  558. unlock();
  559. }
  560. // constant
  561. bool SpielServer::istAn() const
  562. {
  563. return db->serverIstNichtPausiert(id);
  564. }
  565. Server* SpielServer::zServer() const
  566. {
  567. return server;
  568. }
  569. SSDatenbank* SpielServer::zDB() const
  570. {
  571. return db;
  572. }
  573. InitDatei* SpielServer::zInit() const
  574. {
  575. return ini;
  576. }
  577. bool SpielServer::hatClients() const
  578. {
  579. return klients->hat(0);
  580. }
  581. int SpielServer::getId() const
  582. {
  583. return id;
  584. }
  585. const char* SpielServer::getLetzterFehler() const
  586. {
  587. return fehler->getText();
  588. }
  589. const char* SpielServer::getIp() const
  590. {
  591. return ini->zWert("ServerIp")->getText();
  592. }
  593. int SpielServer::getPort() const
  594. {
  595. if (!ini->wertExistiert("ServerPort"))
  596. return 0;
  597. return TextZuInt(ini->zWert("ServerPort")->getText(), 10);
  598. }
  599. // Inhalt der SSAKlient Klasse aus SpielServer.h
  600. // Konstruktor
  601. SSAKlient::SSAKlient(SSLSKlient* klient, SpielServer* ss)
  602. : Thread()
  603. {
  604. this->klient = klient;
  605. name = new Text("");
  606. passwort = new Text("");
  607. adminId = 0;
  608. version = 0;
  609. this->ss = ss;
  610. }
  611. // Destruktor
  612. SSAKlient::~SSAKlient()
  613. {
  614. klient->trenne();
  615. klient->release();
  616. ss->release();
  617. name->release();
  618. passwort->release();
  619. }
  620. // nicht constant
  621. void SSAKlient::thread()
  622. {
  623. while (1)
  624. {
  625. char c = 0;
  626. if (!klient->getNachricht(&c, 1))
  627. break;
  628. else
  629. {
  630. bool br = 0;
  631. switch (c)
  632. {
  633. case 1: // Login
  634. if (1)
  635. {
  636. klient->sende("\1", 1);
  637. unsigned char nLen = 0;
  638. klient->getNachricht((char*)&nLen, 1);
  639. char* n = new char[nLen + 1];
  640. n[(int)nLen] = 0;
  641. if (nLen)
  642. klient->getNachricht(n, nLen);
  643. unsigned char pLen = 0;
  644. klient->getNachricht((char*)&pLen, 1);
  645. char* p = new char[pLen + 1];
  646. p[(int)pLen] = 0;
  647. if (pLen)
  648. klient->getNachricht(p, pLen);
  649. int adminId = ss->zDB()->istAdministrator(n, p);
  650. if (adminId)
  651. {
  652. klient->sende("\1", 1);
  653. name->setText(n);
  654. passwort->setText(p);
  655. this->adminId = adminId;
  656. }
  657. else
  658. errorZuKlient("Falsche Kombination aus Name und Passwort.");
  659. delete[] n;
  660. delete[] p;
  661. }
  662. break;
  663. case 2: // Logout
  664. adminId = 0;
  665. name->setText("");
  666. passwort->setText("");
  667. klient->sende("\1", 1);
  668. break;
  669. case 3: // Trennen
  670. br = 1;
  671. klient->sende("\1", 1);
  672. break;
  673. case 4: // Server starten
  674. if (!adminId)
  675. errorZuKlient("Du musst dich einloggen.");
  676. else
  677. {
  678. if (ss->zDB()->adminHatRecht(adminId, Admin_Recht::SSStarten))
  679. {
  680. if (!ss->serverStarten())
  681. {
  682. Text* err = new Text();
  683. err->append(ss->getLetzterFehler());
  684. errorZuKlient(err->getText());
  685. err->release();
  686. }
  687. else
  688. klient->sende("\1", 1);
  689. }
  690. else
  691. errorZuKlient("Du bist nicht berechtigt den Server zu starten.");
  692. }
  693. break;
  694. case 5: // Server beenden
  695. if (!adminId)
  696. errorZuKlient("Du musst dich einloggen.");
  697. else
  698. {
  699. if (ss->zDB()->adminHatRecht(adminId, Admin_Recht::SSBeenden))
  700. {
  701. if (ss->serverBeenden())
  702. klient->sende("\1", 1);
  703. else
  704. {
  705. Text* err = new Text();
  706. err->append(ss->getLetzterFehler());
  707. errorZuKlient(err->getText());
  708. err->release();
  709. }
  710. }
  711. else
  712. errorZuKlient("Du bist nicht berechtigt den Server zu beenden.");
  713. }
  714. break;
  715. case 6: // Programm Schließen
  716. if (!adminId)
  717. errorZuKlient("Du musst dich einloggen.");
  718. else
  719. {
  720. bool ok = 0;
  721. if (ss->isRunning())
  722. {
  723. if (ss->zDB()->adminHatRecht(adminId, Admin_Recht::SSBeenden))
  724. {
  725. if (ss->serverBeenden())
  726. ok = 1;
  727. else
  728. {
  729. Text* err = new Text();
  730. err->append(ss->getLetzterFehler());
  731. errorZuKlient(err->getText());
  732. err->release();
  733. }
  734. }
  735. else
  736. errorZuKlient("Du bist nicht berechtigt den Server zu beenden.");
  737. }
  738. else
  739. ok = 1;
  740. if (ok && ss->hatClients())
  741. {
  742. errorZuKlient("Es sind noch Klients Online. Bitte versuche es später erneut.");
  743. break;
  744. }
  745. if (ok)
  746. {
  747. klient->sende("\1", 1);
  748. std::cout << "SS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  749. ss->close();
  750. br = 1;
  751. }
  752. }
  753. break;
  754. case 7: // Progtamm abstürzen
  755. if (!adminId)
  756. errorZuKlient("Du musst dich einloggen.");
  757. else
  758. {
  759. bool ok = 0;
  760. if (ss->isRunning())
  761. {
  762. if (ss->zDB()->adminHatRecht(adminId, Admin_Recht::SSBeenden))
  763. {
  764. ss->serverBeenden();
  765. ok = 1;
  766. }
  767. else
  768. errorZuKlient("Du bist nicht berechtigt den Server zu beenden.");
  769. }
  770. else
  771. ok = 1;
  772. if (ok)
  773. {
  774. klient->sende("\1", 1);
  775. std::cout << "sS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  776. ss->close();
  777. br = 1;
  778. }
  779. }
  780. break;
  781. case 8: // Status Frage
  782. if (1)
  783. {
  784. char status = 0;
  785. if (ss->isRunning())
  786. {
  787. status = 1;
  788. if (ss->istAn())
  789. status = 2;
  790. }
  791. klient->sende("\1", 1);
  792. klient->sende(&status, 1);
  793. }
  794. break;
  795. case 9: // Server pausieren
  796. if (!adminId)
  797. errorZuKlient("Du musst dich einloggen.");
  798. else
  799. {
  800. klient->sende("\1", 1);
  801. char pause = 0;
  802. klient->getNachricht(&pause, 1);
  803. if (ss->zDB()->adminHatRecht(adminId, Admin_Recht::SSPausieren))
  804. {
  805. bool ok = 0;
  806. if (pause)
  807. ok = ss->serverPause();
  808. else
  809. ok = ss->serverFortsetzen();
  810. if (ok)
  811. klient->sende("\1", 1);
  812. else
  813. {
  814. Text* err = new Text();
  815. err->append(ss->getLetzterFehler());
  816. errorZuKlient(err->getText());
  817. err->release();
  818. }
  819. }
  820. else
  821. {
  822. if (pause)
  823. errorZuKlient("Du bist nicht berechtigt den Server zu pausieren.");
  824. else
  825. errorZuKlient("Du bist nicht berechtigt den Server fortzusetzen.");
  826. }
  827. }
  828. break;
  829. case 0xA: // maximale Anzahl der Spiele setzen
  830. if (!adminId)
  831. errorZuKlient("Du musst dich einloggen.");
  832. else
  833. {
  834. klient->sende("\1", 1);
  835. int maxS = 0;
  836. klient->getNachricht((char*)&maxS, 4);
  837. if (ss->zDB()->adminHatRecht(adminId, Admin_Recht::SSMSChange))
  838. {
  839. if (ss->setMaxSpiele(maxS))
  840. klient->sende("\1", 1);
  841. else
  842. {
  843. Text* err = new Text();
  844. err->append(ss->getLetzterFehler());
  845. errorZuKlient(err->getText());
  846. err->release();
  847. }
  848. }
  849. else
  850. errorZuKlient("Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern.");
  851. }
  852. break;
  853. case 0xB: // Spiel Historie downloaden
  854. if (adminId)
  855. errorZuKlient("Zugriff verweigert.");
  856. else
  857. {
  858. klient->sende("\1", 1);
  859. int spielId = 0;
  860. klient->getNachricht((char*)&spielId, 4);
  861. if (!ss->hatSpielHistorieId(spielId))
  862. {
  863. errorZuKlient("Zugriff auf Spiel-Historie verweigert.");
  864. break;
  865. }
  866. Text* pfad = new Text("../spiel log/");
  867. *pfad += spielId;
  868. *pfad += "/fertig";
  869. if (!DateiExistiert(*pfad))
  870. {
  871. pfad->release();
  872. errorZuKlient("Die Spiel-Historie wurde nicht gefunden.");
  873. break;
  874. }
  875. klient->sende("\1", 1);
  876. pfad->remove("/fertig");
  877. sendeVerzeichnisAnKlient(*pfad, pfad->getLength() + 1);
  878. pfad->release();
  879. klient->sende("\0", 1);
  880. }
  881. break;
  882. case 0xC: // klient absturtz
  883. if (1)
  884. {
  885. klient->sende("\1", 1);
  886. int klientId = 0;
  887. klient->getNachricht((char*)&klientId, 4);
  888. if (klientId && ss->absturzKlient(klientId))
  889. klient->sende("\1", 1);
  890. else
  891. klient->sende("\0", 1);
  892. }
  893. break;
  894. default:
  895. errorZuKlient("Unbekannte Nachricht!");
  896. break;
  897. }
  898. if (br)
  899. break;
  900. ss->addEmpfangen(klient->getDownloadBytes(1));
  901. ss->addGesendet(klient->getUploadBytes(1));
  902. }
  903. }
  904. ss->addEmpfangen(klient->getDownloadBytes(1));
  905. ss->addGesendet(klient->getUploadBytes(1));
  906. delete this;
  907. }
  908. void SSAKlient::sendeVerzeichnisAnKlient(const char* pfad, int gpl)
  909. {
  910. Datei* d = new Datei();
  911. d->setDatei(pfad);
  912. if (d->istOrdner())
  913. {
  914. int dAnz = d->getUnterdateiAnzahl();
  915. RCArray< Text >* list = d->getDateiListe();
  916. for (int i = 0; i < dAnz; i++)
  917. {
  918. if (list->z(i))
  919. {
  920. Text* pf = new Text(pfad);
  921. pf->append("/");
  922. pf->append(list->z(i)->getText());
  923. sendeVerzeichnisAnKlient(*pf, gpl);
  924. pf->release();
  925. }
  926. }
  927. list->release();
  928. }
  929. else if (d->existiert())
  930. {
  931. __int64 gr = d->getSize();
  932. if (gr && d->zPfad()->getLength() - gpl > 0 && d->open(Datei::Style::lesen))
  933. {
  934. char pfLen = (char)(d->zPfad()->getLength() - gpl);
  935. klient->sende(&pfLen, 1);
  936. klient->sende(d->zPfad()->getText() + gpl, pfLen);
  937. klient->sende((char*)&gr, 8);
  938. char* bytes = new char[2048];
  939. while (gr)
  940. {
  941. short len = gr > 2048 ? 2048 : (short)gr;
  942. d->lese(bytes, len);
  943. klient->sende(bytes, len);
  944. gr -= len;
  945. }
  946. delete[] bytes;
  947. d->close();
  948. }
  949. }
  950. d->release();
  951. }
  952. void SSAKlient::errorZuKlient(const char* nachricht) const // sendet eine Fehlernachricht zum Klient
  953. {
  954. klient->sende("\3", 1);
  955. char len = (char)textLength(nachricht);
  956. klient->sende(&len, 1);
  957. klient->sende(nachricht, len);
  958. }
  959. // Inhalt der SSKlient Klasse aus SpielServer.h
  960. // Konstruktor
  961. SSKlient::SSKlient(SKlient* klient, SpielServer* ss)
  962. : SSKlientV()
  963. {
  964. empfangen = klient;
  965. unsigned char key[20] = { 253, 234, 211, 132, 121, 230, 95, 145, 201, 13, 43, 77, 153, 223, 253, 69, 234, 43, 52, 99 };
  966. klient->setSendeKey((char*)key, 20);
  967. klient->setEmpfangKey((char*)key, 20);
  968. senden = 0;
  969. this->ss = ss;
  970. accountId = 0;
  971. klientNummer = 0;
  972. termThread = 1;
  973. verbunden = 0;
  974. zErstellt = 0;
  975. zSpiel = 0;
  976. InitializeCriticalSection(&cs);
  977. }
  978. // Destruktor
  979. SSKlient::~SSKlient()
  980. {
  981. lock();
  982. unlock();
  983. if (verbunden)
  984. trenne();
  985. if (termThread)
  986. {
  987. if (verbunden)
  988. warteAufThread(1000);
  989. if (verbunden)
  990. {
  991. if (empfangen)
  992. empfangen->trenne();
  993. if (senden)
  994. senden->trenne();
  995. }
  996. if (empfangen)
  997. empfangen->release();
  998. if (senden)
  999. senden->release();
  1000. DeleteCriticalSection(&cs);
  1001. ss->klientsMM(this);
  1002. ss->release();
  1003. ende(); // Eventuelles Ende des Aktuellen Threades
  1004. }
  1005. else
  1006. {
  1007. if (verbunden)
  1008. {
  1009. if (empfangen)
  1010. empfangen->trenne();
  1011. if (senden)
  1012. senden->trenne();
  1013. }
  1014. if (empfangen)
  1015. empfangen->release();
  1016. if (senden)
  1017. senden->release();
  1018. DeleteCriticalSection(&cs);
  1019. ss->klientsMM(this);
  1020. ss->release();
  1021. }
  1022. }
  1023. // nicht constant
  1024. void SSKlient::lock()
  1025. {
  1026. EnterCriticalSection(&cs);
  1027. }
  1028. void SSKlient::unlock()
  1029. {
  1030. LeaveCriticalSection(&cs);
  1031. }
  1032. void SSKlient::absturz()
  1033. {
  1034. ende();
  1035. if (senden)
  1036. senden->trenne();
  1037. empfangen->trenne();
  1038. }
  1039. void SSKlient::setSpielErstellt(SpielErstellt* zErstellt)
  1040. {
  1041. this->zErstellt = zErstellt;
  1042. }
  1043. void SSKlient::setSpiel(Spiel* zSpiel)
  1044. {
  1045. this->zSpiel = zSpiel;
  1046. }
  1047. void SSKlient::nichtTrennen()
  1048. {
  1049. verbunden = 0;
  1050. }
  1051. void SSKlient::spielGefunden(int karteId)
  1052. {
  1053. if (!senden)
  1054. return;
  1055. lock();
  1056. senden->sendeEncrypted("\xB", 1);
  1057. senden->sendeEncrypted((char*)&karteId, 4);
  1058. unlock();
  1059. ss->addEmpfangen(senden->getDownloadBytes(1));
  1060. ss->addGesendet(senden->getUploadBytes(1));
  1061. }
  1062. void SSKlient::zeitVerbleibend(char sekunden)
  1063. {
  1064. if (!senden)
  1065. return;
  1066. lock();
  1067. senden->sendeEncrypted("\1", 1);
  1068. senden->sendeEncrypted(&sekunden, 1);
  1069. unlock();
  1070. ss->addEmpfangen(senden->getDownloadBytes(1));
  1071. ss->addGesendet(senden->getUploadBytes(1));
  1072. }
  1073. void SSKlient::erstellungAbgebrochen(const char* grund)
  1074. {
  1075. if (!senden)
  1076. return;
  1077. char len = (char)textLength(grund);
  1078. lock();
  1079. senden->sendeEncrypted("\2", 1);
  1080. senden->sendeEncrypted(&len, 1);
  1081. if (len)
  1082. senden->sendeEncrypted(grund, len);
  1083. unlock();
  1084. ss->addEmpfangen(senden->getDownloadBytes(1));
  1085. ss->addGesendet(senden->getUploadBytes(1));
  1086. }
  1087. void SSKlient::backInWarteschlange(char st, char min, char sec)
  1088. {
  1089. if (!senden)
  1090. return;
  1091. lock();
  1092. senden->sendeEncrypted("\4", 1);
  1093. senden->sendeEncrypted(&st, 1);
  1094. senden->sendeEncrypted(&min, 1);
  1095. senden->sendeEncrypted(&sec, 1);
  1096. unlock();
  1097. ss->addEmpfangen(senden->getDownloadBytes(1));
  1098. ss->addGesendet(senden->getUploadBytes(1));
  1099. }
  1100. void SSKlient::erstellungFortsetzen()
  1101. {
  1102. if (!senden)
  1103. return;
  1104. lock();
  1105. senden->sendeEncrypted("\5", 1);
  1106. unlock();
  1107. ss->addEmpfangen(senden->getDownloadBytes(1));
  1108. ss->addGesendet(senden->getUploadBytes(1));
  1109. }
  1110. void SSKlient::erstellungInitialisierung(SpielerTeamStruktur* sts)
  1111. {
  1112. if (!senden)
  1113. return;
  1114. lock();
  1115. senden->sendeEncrypted("\6", 1);
  1116. senden->sendeEncrypted((char*)&sts->spielerAnzahl, 4);
  1117. senden->sendeEncrypted((char*)&sts->teamAnzahl, 4);
  1118. for (int i = 0; i < sts->spielerAnzahl; i++)
  1119. {
  1120. int f = sts->spielerFarbe->hat(i) ? sts->spielerFarbe->get(i) : 0;
  1121. senden->sendeEncrypted((char*)&f, 4);
  1122. }
  1123. for (int i = 0; i < sts->teamAnzahl; i++)
  1124. {
  1125. int f = sts->teamFarbe->hat(i) ? sts->teamFarbe->get(i) : 0;
  1126. senden->sendeEncrypted((char*)&f, 4);
  1127. }
  1128. for (int i = 0; i < sts->teamAnzahl; i++)
  1129. {
  1130. Text* name = sts->teamName->z(i);
  1131. char len = (char)name->getLength();
  1132. senden->sendeEncrypted(&len, 1);
  1133. if (len)
  1134. senden->sendeEncrypted(name->getText(), len);
  1135. }
  1136. for (int i = 0; i < sts->teamAnzahl; i++)
  1137. {
  1138. int size = sts->teamSize->hat(i) ? sts->teamSize->get(i) : 0;
  1139. senden->sendeEncrypted((char*)&size, 4);
  1140. }
  1141. unlock();
  1142. ss->addEmpfangen(senden->getDownloadBytes(1));
  1143. ss->addGesendet(senden->getUploadBytes(1));
  1144. }
  1145. void SSKlient::erstellungAddSpieler(int accountId)
  1146. {
  1147. if (!senden)
  1148. return;
  1149. lock();
  1150. senden->sendeEncrypted("\7", 1);
  1151. senden->sendeEncrypted((char*)&accountId, 4);
  1152. unlock();
  1153. ss->addEmpfangen(senden->getDownloadBytes(1));
  1154. ss->addGesendet(senden->getUploadBytes(1));
  1155. }
  1156. void SSKlient::erstellungRemoveSpieler(int accountId)
  1157. {
  1158. if (!senden)
  1159. return;
  1160. lock();
  1161. senden->sendeEncrypted("\x8", 1);
  1162. senden->sendeEncrypted((char*)&accountId, 4);
  1163. unlock();
  1164. ss->addEmpfangen(senden->getDownloadBytes(1));
  1165. ss->addGesendet(senden->getUploadBytes(1));
  1166. }
  1167. void SSKlient::erstellungSpielerTeam(int accountId, int spielerNummer)
  1168. {
  1169. if (!senden)
  1170. return;
  1171. lock();
  1172. senden->sendeEncrypted("\x9", 1);
  1173. senden->sendeEncrypted((char*)&accountId, 4);
  1174. senden->sendeEncrypted((char*)&spielerNummer, 4);
  1175. unlock();
  1176. ss->addEmpfangen(senden->getDownloadBytes(1));
  1177. ss->addGesendet(senden->getUploadBytes(1));
  1178. }
  1179. void SSKlient::erstellungChatNachricht(const char* nachricht)
  1180. {
  1181. if (!senden)
  1182. return;
  1183. char len = (char)textLength(nachricht);
  1184. if (!len)
  1185. return;
  1186. lock();
  1187. senden->sendeEncrypted("\xA", 1);
  1188. senden->sendeEncrypted(&len, 1);
  1189. senden->sendeEncrypted(nachricht, len);
  1190. unlock();
  1191. ss->addEmpfangen(senden->getDownloadBytes(1));
  1192. ss->addGesendet(senden->getUploadBytes(1));
  1193. }
  1194. void SSKlient::spielLadenBeginn()
  1195. {
  1196. if (!senden)
  1197. return;
  1198. lock();
  1199. senden->sendeEncrypted("\xC", 1);
  1200. unlock();
  1201. ss->addEmpfangen(senden->getDownloadBytes(1));
  1202. ss->addGesendet(senden->getUploadBytes(1));
  1203. }
  1204. void SSKlient::spielLadenSpielerAdd(int accId, int spielerNumer)
  1205. {
  1206. if (!senden)
  1207. return;
  1208. lock();
  1209. senden->sendeEncrypted("\xD", 1);
  1210. senden->sendeEncrypted((char*)&accId, 4);
  1211. senden->sendeEncrypted((char*)&spielerNumer, 4);
  1212. unlock();
  1213. ss->addEmpfangen(senden->getDownloadBytes(1));
  1214. ss->addGesendet(senden->getUploadBytes(1));
  1215. }
  1216. void SSKlient::spielLadenSetSpielerProzent(int accId, int prozent)
  1217. {
  1218. if (!senden)
  1219. return;
  1220. lock();
  1221. senden->sendeEncrypted("\xE", 1);
  1222. senden->sendeEncrypted((char*)&accId, 4);
  1223. senden->sendeEncrypted((char*)&prozent, 4);
  1224. unlock();
  1225. ss->addEmpfangen(senden->getDownloadBytes(1));
  1226. ss->addGesendet(senden->getUploadBytes(1));
  1227. }
  1228. void SSKlient::spielLadenSetSpielerPing(int accId, int ping)
  1229. {
  1230. if (!senden)
  1231. return;
  1232. lock();
  1233. senden->sendeEncrypted("\xF", 1);
  1234. senden->sendeEncrypted((char*)&accId, 4);
  1235. senden->sendeEncrypted((char*)&ping, 4);
  1236. unlock();
  1237. ss->addEmpfangen(senden->getDownloadBytes(1));
  1238. ss->addGesendet(senden->getUploadBytes(1));
  1239. }
  1240. double SSKlient::ping()
  1241. {
  1242. if (!senden)
  1243. return 0;
  1244. ZeitMesser* zeit = new ZeitMesser();
  1245. char ret = 0;
  1246. lock();
  1247. zeit->messungStart();
  1248. senden->sendeEncrypted("\x10", 1);
  1249. senden->getNachrichtEncrypted(&ret, 1);
  1250. zeit->messungEnde();
  1251. unlock();
  1252. double retVal = zeit->getSekunden();
  1253. zeit->release();
  1254. ss->addEmpfangen(senden->getDownloadBytes(1));
  1255. ss->addGesendet(senden->getUploadBytes(1));
  1256. return retVal;
  1257. }
  1258. void SSKlient::spielLadenFertig()
  1259. {
  1260. if (!senden)
  1261. return;
  1262. lock();
  1263. senden->sendeEncrypted("\x11", 1);
  1264. unlock();
  1265. ss->addEmpfangen(senden->getDownloadBytes(1));
  1266. ss->addGesendet(senden->getUploadBytes(1));
  1267. }
  1268. void SSKlient::spielNachricht(short len, const char* bytes)
  1269. {
  1270. if (!senden)
  1271. return;
  1272. lock();
  1273. senden->sendeEncrypted("\x12", 1);
  1274. senden->sende((char*)&len, 2);
  1275. senden->sende(bytes, len);
  1276. unlock();
  1277. ss->addEmpfangen(senden->getDownloadBytes(1));
  1278. ss->addGesendet(senden->getUploadBytes(1));
  1279. }
  1280. void SSKlient::statistikNachricht(short len, const char* bytes)
  1281. {
  1282. if (!senden)
  1283. return;
  1284. lock();
  1285. senden->sendeEncrypted("\x13", 1);
  1286. senden->sendeEncrypted((char*)&len, 2);
  1287. senden->sendeEncrypted(bytes, len);
  1288. unlock();
  1289. ss->addEmpfangen(senden->getDownloadBytes(1));
  1290. ss->addGesendet(senden->getUploadBytes(1));
  1291. }
  1292. bool SSKlient::keepAlive()
  1293. {
  1294. if (!senden || !verbunden)
  1295. return 0;
  1296. char res = 0;
  1297. lock();
  1298. senden->sendeEncrypted("\x14", 1);
  1299. senden->getNachrichtEncrypted(&res, 1);
  1300. unlock();
  1301. return res == 1;
  1302. }
  1303. void SSKlient::trenne()
  1304. {
  1305. if (!verbunden)
  1306. return;
  1307. verbunden = 0;
  1308. if (!senden)
  1309. return;
  1310. lock();
  1311. senden->sendeEncrypted("\0", 1);
  1312. unlock();
  1313. ss->addEmpfangen(senden->getDownloadBytes(1));
  1314. ss->addGesendet(senden->getUploadBytes(1));
  1315. }
  1316. void SSKlient::setSenden(SSKlient* klient)
  1317. {
  1318. senden = klient->getKlient();
  1319. Text* key = ss->zDB()->getKlientKey(klientNummer);
  1320. if (!key)
  1321. {
  1322. senden->sendeEncrypted("\0", 1);
  1323. errorZuKlientSende("Es konnte kein Key ermittelt werden.");
  1324. }
  1325. else
  1326. {
  1327. senden->sendeEncrypted("\1", 1);
  1328. senden->setEmpfangKey(*key, key->getLength());
  1329. senden->setSendeKey(*key, key->getLength());
  1330. key->release();
  1331. }
  1332. verbunden = 1;
  1333. if (!ss->verteileKlient(this))
  1334. ss->unregisterKlient(this);
  1335. klient->nichtTrennen();
  1336. klient->release();
  1337. ss->addEmpfangen(senden->getDownloadBytes(1));
  1338. ss->addGesendet(senden->getUploadBytes(1));
  1339. }
  1340. void SSKlient::thread()
  1341. {
  1342. int unbekannt = 0;
  1343. bool del = 0;
  1344. while (1)
  1345. {
  1346. bool br = 0;
  1347. char message = 0;
  1348. if (empfangen->getNachrichtEncrypted(&message, 1))
  1349. {
  1350. switch (message)
  1351. {
  1352. case 1: // Klient Identifikation
  1353. empfangen->getNachrichtEncrypted((char*)&klientNummer, 4);
  1354. if (!klientNummer)
  1355. errorZuKlientEmpfang("Du besitzt noch keine Klient Nummer.");
  1356. else
  1357. {
  1358. accountId = ss->zDB()->getAccountId(klientNummer);
  1359. termThread = 0;
  1360. if (ss->registerKlient(this))
  1361. return;
  1362. termThread = 1;
  1363. Text* key = ss->zDB()->getKlientKey(klientNummer);
  1364. if (!key)
  1365. errorZuKlientEmpfang("Es konnte kein Key ermittelt werden.");
  1366. else
  1367. {
  1368. empfangen->sendeEncrypted("\1", 1);
  1369. empfangen->setEmpfangKey(*key, key->getLength());
  1370. empfangen->setSendeKey(*key, key->getLength());
  1371. key->release();
  1372. }
  1373. }
  1374. break;
  1375. case 2: // Main / Erhaltung Server message
  1376. if (1)
  1377. {
  1378. char befehl = 0;
  1379. empfangen->getNachrichtEncrypted(&befehl, 1);
  1380. switch (befehl)
  1381. {
  1382. case 2: // klient absturtz
  1383. if (1)
  1384. {
  1385. int klientId = 0;
  1386. empfangen->getNachrichtEncrypted((char*)&klientId, 4);
  1387. if (klientId && ss->absturzKlient(klientId))
  1388. empfangen->sendeEncrypted("\1", 1);
  1389. else
  1390. empfangen->sendeEncrypted("\0", 1);
  1391. }
  1392. break;
  1393. default:
  1394. errorZuKlientEmpfang("Befehl nicht bekannt!");
  1395. break;
  1396. }
  1397. }
  1398. break;
  1399. case 3: // Verbindungsende
  1400. trenne();
  1401. empfangen->sendeEncrypted("\1", 1);
  1402. br = 1;
  1403. break;
  1404. case 4: // SpielErstellt annehmen
  1405. if (zErstellt)
  1406. {
  1407. if (zErstellt->klientNimmtAn(accountId))
  1408. empfangen->sendeEncrypted("\1", 1);
  1409. else
  1410. {
  1411. empfangen->sendeEncrypted("\0", 1);
  1412. errorZuKlientSende("Es ist ein unbekannter Fehler aufgetreten.");
  1413. }
  1414. }
  1415. else
  1416. {
  1417. empfangen->sendeEncrypted("\0", 1);
  1418. errorZuKlientSende("Dir wurde kein erstelltes Spiel zugeteilt.");
  1419. }
  1420. break;
  1421. case 5: // SpielErstellt ablehnen
  1422. if (zErstellt)
  1423. {
  1424. if (zErstellt->klientLehntAb(accountId))
  1425. empfangen->sendeEncrypted("\1", 1);
  1426. else
  1427. {
  1428. empfangen->sendeEncrypted("\0", 1);
  1429. errorZuKlientSende("Es ist ein unbekannter Fehler aufgetreten.");
  1430. }
  1431. }
  1432. else
  1433. {
  1434. empfangen->sendeEncrypted("\0", 1);
  1435. errorZuKlientSende("Dir wurde kein erstelltes Spiel zugeteilt.");
  1436. }
  1437. break;
  1438. case 6: // SpielErstellt team wechseln
  1439. if (zSpiel)
  1440. {
  1441. empfangen->sendeEncrypted("\1", 1);
  1442. int team = 0;
  1443. empfangen->getNachrichtEncrypted((char*)&team, 4);
  1444. if (zSpiel->klientWechseltTeam(accountId, team))
  1445. empfangen->sendeEncrypted("\1", 1);
  1446. else
  1447. {
  1448. empfangen->sendeEncrypted("\0", 1);
  1449. errorZuKlientSende("Das Team Ist bereits voll.");
  1450. }
  1451. }
  1452. else
  1453. {
  1454. empfangen->sendeEncrypted("\0", 1);
  1455. errorZuKlientSende("Dir wurde kein erstelltes Spiel zugeteilt.");
  1456. }
  1457. break;
  1458. case 7: // SpielErstellt chat Nachricht
  1459. if (zSpiel)
  1460. {
  1461. empfangen->sendeEncrypted("\1", 1);
  1462. unsigned char len = 0;
  1463. empfangen->getNachrichtEncrypted((char*)&len, 1);
  1464. char* nachricht = new char[len + 1];
  1465. nachricht[(int)len] = 0;
  1466. if (len)
  1467. empfangen->getNachrichtEncrypted(nachricht, len);
  1468. Text* msg = ss->zDB()->getAccountRufName(accountId);
  1469. msg->append(": ");
  1470. msg->append(nachricht);
  1471. delete[] nachricht;
  1472. if (zSpiel->chatNachricht(msg->getText()))
  1473. empfangen->sendeEncrypted("\1", 1);
  1474. else
  1475. {
  1476. empfangen->sendeEncrypted("\0", 1);
  1477. errorZuKlientSende("Es ist ein unbekannter Fehler aufgetreten.");
  1478. }
  1479. msg->release();
  1480. }
  1481. else
  1482. {
  1483. empfangen->sendeEncrypted("\0", 1);
  1484. errorZuKlientSende("Dir wurde kein erstelltes Spiel zugeteilt.");
  1485. }
  1486. break;
  1487. case 8: // Server Message
  1488. if (1)
  1489. {
  1490. char befehl = 0;
  1491. empfangen->getNachrichtEncrypted(&befehl, 1);
  1492. switch (befehl)
  1493. {
  1494. case 0: // Verbindung Trennen
  1495. empfangen->sendeEncrypted("\1", 1);
  1496. br = 1;
  1497. del = 1;
  1498. break;
  1499. case 1: // Spiel Erstellen Abbrechen
  1500. if (1)
  1501. {
  1502. empfangen->sendeEncrypted("\1", 1);
  1503. int spielErstelltId = 0;
  1504. empfangen->getNachrichtEncrypted((char*)&spielErstelltId, 4);
  1505. ss->SpielErstelltAbbruch(spielErstelltId);
  1506. empfangen->sendeEncrypted("\1", 1);
  1507. }
  1508. break;
  1509. default:
  1510. empfangen->sendeEncrypted("\0", 1);
  1511. break;
  1512. }
  1513. }
  1514. break;
  1515. case 9: // Bereit zum Laden
  1516. if (zSpiel && zSpiel->klientBereitZumLaden(accountId))
  1517. empfangen->sendeEncrypted("\1", 1);
  1518. else
  1519. {
  1520. empfangen->sendeEncrypted("\0", 1);
  1521. errorZuKlientSende("Es ist ein unbekannter Fehler aufgetreten.");
  1522. }
  1523. break;
  1524. case 0xA: // Bereit zum Spiel
  1525. if (zSpiel && zSpiel->klientBereitZumSpiel(accountId))
  1526. empfangen->sendeEncrypted("\1", 1);
  1527. else
  1528. {
  1529. empfangen->sendeEncrypted("\0", 1);
  1530. errorZuKlientSende("Es ist ein unbekannter Fehler aufgetreten.");
  1531. }
  1532. break;
  1533. case 0xB: // Spiel Nachricht
  1534. if (1)
  1535. {
  1536. unsigned short len = 0;
  1537. empfangen->getNachricht((char*)&len, 2);
  1538. char* bytes = new char[len];
  1539. empfangen->getNachricht(bytes, len);
  1540. if (!zSpiel || !zSpiel->spielNachricht(accountId, len, bytes))
  1541. errorZuKlientSende("Es ist ein unbekannter Fehler aufgetreten.");
  1542. delete[] bytes;
  1543. }
  1544. break;
  1545. case 0xC: // Spiel Laden Prozent
  1546. if (1)
  1547. {
  1548. empfangen->sendeEncrypted("\1", 1);
  1549. int prozent = 0;
  1550. empfangen->getNachrichtEncrypted((char*)&prozent, 4);
  1551. if (zSpiel && zSpiel->klientSpielLadenProzent(accountId, prozent))
  1552. empfangen->sendeEncrypted("\1", 1);
  1553. else
  1554. {
  1555. empfangen->sendeEncrypted("\0", 1);
  1556. errorZuKlientSende("Es ist ein unbekannter Fehler aufgetreten.");
  1557. }
  1558. }
  1559. break;
  1560. case 0xD: // Statistik Nachricht
  1561. if (1)
  1562. {
  1563. empfangen->sendeEncrypted("\1", 1);
  1564. unsigned short len = 0;
  1565. empfangen->getNachrichtEncrypted((char*)&len, 2);
  1566. char* bytes = new char[len];
  1567. empfangen->getNachrichtEncrypted(bytes, len);
  1568. if (zSpiel && zSpiel->statistikNachricht(accountId, len, bytes))
  1569. empfangen->sendeEncrypted("\1", 1);
  1570. else
  1571. {
  1572. empfangen->sendeEncrypted("\0", 1);
  1573. errorZuKlientSende("Es ist ein unbekannter Fehler aufgetreten.");
  1574. }
  1575. delete[] bytes;
  1576. }
  1577. break;
  1578. case 0xE: // Team wählen Fertig
  1579. if (1)
  1580. {
  1581. if (zSpiel && zSpiel->klientTeamAuswahlFertig(accountId))
  1582. empfangen->sendeEncrypted("\1", 1);
  1583. else
  1584. {
  1585. empfangen->sendeEncrypted("\0", 1);
  1586. errorZuKlientSende("Es ist ein unbekannter Fehler aufgetreten.");
  1587. }
  1588. }
  1589. break;
  1590. case 0xF: // ping
  1591. if (1)
  1592. {
  1593. empfangen->sendeEncrypted("\1", 1);
  1594. keepAlive();
  1595. }
  1596. break;
  1597. default:
  1598. empfangen->sendeEncrypted("\0", 1);
  1599. errorZuKlientSende("Unbekannte Nachricht.");
  1600. unbekannt += 2;
  1601. if (unbekannt > 10)
  1602. {
  1603. trenne();
  1604. br = 1;
  1605. }
  1606. break;
  1607. }
  1608. unbekannt--;
  1609. if (unbekannt < 0)
  1610. unbekannt = 0;
  1611. }
  1612. else
  1613. {
  1614. trenne();
  1615. br = 1;
  1616. }
  1617. if (br)
  1618. break;
  1619. ss->addEmpfangen(empfangen->getDownloadBytes(1));
  1620. ss->addGesendet(empfangen->getUploadBytes(1));
  1621. }
  1622. ss->addEmpfangen(empfangen->getDownloadBytes(1));
  1623. ss->addGesendet(empfangen->getUploadBytes(1));
  1624. if (del || !accountId)
  1625. {
  1626. termThread = 0;
  1627. delete this;
  1628. }
  1629. else
  1630. {
  1631. termThread = 0;
  1632. ss->unregisterKlient(this);
  1633. }
  1634. }
  1635. void SSKlient::errorZuKlientEmpfang(const char* nachricht) // sendet eine Fehlernachricht zum Klient
  1636. {
  1637. unsigned char len = (unsigned char)textLength(nachricht);
  1638. if (!len)
  1639. return;
  1640. if (empfangen)
  1641. {
  1642. empfangen->sendeEncrypted("\3", 1);
  1643. empfangen->sendeEncrypted((char*)&len, 1);
  1644. empfangen->sendeEncrypted(nachricht, len);
  1645. }
  1646. ss->addEmpfangen(empfangen->getDownloadBytes(1));
  1647. ss->addGesendet(empfangen->getUploadBytes(1));
  1648. }
  1649. void SSKlient::errorZuKlientSende(const char* nachricht)
  1650. {
  1651. unsigned char len = (unsigned char)textLength(nachricht);
  1652. if (!len)
  1653. return;
  1654. if (senden)
  1655. {
  1656. lock();
  1657. senden->sendeEncrypted("\3", 1);
  1658. senden->sendeEncrypted((char*)&len, 1);
  1659. senden->sendeEncrypted(nachricht, len);
  1660. unlock();
  1661. ss->addEmpfangen(senden->getDownloadBytes(1));
  1662. ss->addGesendet(senden->getUploadBytes(1));
  1663. }
  1664. }
  1665. // const
  1666. int SSKlient::getAccountId() const
  1667. {
  1668. return accountId;
  1669. }
  1670. int SSKlient::getKlientNummer() const
  1671. {
  1672. return klientNummer;
  1673. }
  1674. SKlient* SSKlient::getKlient() const
  1675. {
  1676. return dynamic_cast<SKlient*>(empfangen->getThis());
  1677. }