NewsServer.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. #include "NewsServer.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. // Inhalt der NewsServer Klasse aus NewsServer.h
  6. // Konstruktor
  7. NewsServer::NewsServer( InitDatei *zIni )
  8. : Thread()
  9. {
  10. Network::Start( 100 );
  11. std::cout << "IS: Verbindung mit Datenbank wird hergestellt...\n";
  12. db = new NSDatenbank( zIni );
  13. klientAnzahl = 0;
  14. klients = new RCArray< NSKlient >();
  15. empfangen = 0;
  16. gesendet = 0;
  17. fehler = new Text();
  18. ini = zIni->getThis();
  19. id = *zIni->zWert( "ServerId" );
  20. server = new Server();
  21. aServer = new SSLServer();
  22. aServer->setPrivateKeyPassword( zIni->zWert( "SSLPasswort" )->getText() );
  23. aServer->setCertificateFile( zIni->zWert( "SSLCert" )->getText() );
  24. aServer->setPrivateKeyFile( zIni->zWert( "SSLKey" )->getText() );
  25. std::cout << "IS: Starten des Admin Servers...\n";
  26. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  27. {
  28. std::cout << "IS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  29. exit( 1 );
  30. }
  31. db->setServerStatus( id, 2 );
  32. end = 0;
  33. nichtPausiert = 0;
  34. InitializeCriticalSection( &cs );
  35. ref = 1;
  36. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  37. {
  38. serverStarten();
  39. serverFortsetzen();
  40. }
  41. }
  42. // Destruktor
  43. NewsServer::~NewsServer()
  44. {
  45. fehler->release();
  46. server->trenne();
  47. server->release();
  48. aServer->trenne();
  49. aServer->release();
  50. if( klients )
  51. klients->release();
  52. ini->release();
  53. db->release();
  54. DeleteCriticalSection( &cs );
  55. }
  56. // nicht constant
  57. void NewsServer::runn()
  58. {
  59. while( !end && aServer->isConnected() )
  60. {
  61. SSLSKlient *klient;
  62. klient = aServer->getKlient();
  63. if( end && klient )
  64. {
  65. klient->trenne();
  66. klient = klient->release();
  67. Sleep( 1000 );
  68. return;
  69. }
  70. if( !klient )
  71. continue;
  72. NSAKlient *clHandle = new NSAKlient( klient, getThis() );
  73. clHandle->start();
  74. }
  75. }
  76. void NewsServer::thread()
  77. {
  78. while( server->isConnected() )
  79. {
  80. SKlient *klient;
  81. klient = server->getKlient();
  82. if( !klient )
  83. continue;
  84. Framework::getThreadRegister()->cleanUpClosedThreads();
  85. NSKlient *clHandle = new NSKlient( klient, getThis() );
  86. EnterCriticalSection( &cs );
  87. klients->set( clHandle, klientAnzahl );
  88. klientAnzahl++;
  89. LeaveCriticalSection( &cs );
  90. clHandle->start();
  91. }
  92. }
  93. void NewsServer::close()
  94. {
  95. db->setServerStatus( id, 1 );
  96. server->trenne();
  97. #ifdef WIN32
  98. warteAufThread( 1000 );
  99. #endif
  100. EnterCriticalSection( &cs );
  101. for( int i = 0; i < klientAnzahl; i++ )
  102. klients->z( i )->absturz();
  103. klients = klients->release();
  104. klientAnzahl = 0;
  105. LeaveCriticalSection( &cs );
  106. ende();
  107. run = 0;
  108. end = 1;
  109. Klient *klient = new Klient();
  110. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  111. Sleep( 500 );
  112. aServer->trenne();
  113. klient->release();
  114. }
  115. bool NewsServer::serverStarten()
  116. {
  117. if( nichtPausiert )
  118. {
  119. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  120. return 0;
  121. }
  122. if( server )
  123. server->release();
  124. server = new Server();
  125. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  126. {
  127. nichtPausiert = 1;
  128. start();
  129. return 1;
  130. }
  131. else
  132. {
  133. serverBeenden();
  134. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  135. return 0;
  136. }
  137. }
  138. bool NewsServer::serverPause()
  139. {
  140. if( !nichtPausiert )
  141. {
  142. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  143. return 0;
  144. }
  145. if( !db->setServerStatus( id, 2 ) )
  146. {
  147. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  148. fehler->append( db->getLetzterFehler() );
  149. return 0;
  150. }
  151. return 1;
  152. }
  153. bool NewsServer::serverFortsetzen()
  154. {
  155. if( !nichtPausiert )
  156. {
  157. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  158. return 0;
  159. }
  160. if( !db->setServerStatus( id, 3 ) )
  161. {
  162. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  163. fehler->append( db->getLetzterFehler() );
  164. return 0;
  165. }
  166. return 1;
  167. }
  168. bool NewsServer::serverBeenden()
  169. {
  170. if( !nichtPausiert )
  171. {
  172. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  173. return 0;
  174. }
  175. if( db->serverIstNichtPausiert( id ) )
  176. {
  177. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  178. return 0;
  179. }
  180. nichtPausiert = 0;
  181. ende();
  182. if( server )
  183. server->trenne();
  184. return 1;
  185. }
  186. bool NewsServer::setMaxKlients( int mc )
  187. {
  188. if( !db->setMaxClients( id, mc ) )
  189. {
  190. fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
  191. fehler->append( db->getLetzterFehler() );
  192. return 0;
  193. }
  194. ini->setWert( "MaxClients", Text() += mc );
  195. return 1;
  196. }
  197. bool NewsServer::absturzKlient( int klientId )
  198. {
  199. bool gefunden = 0;
  200. EnterCriticalSection( &cs );
  201. for( int i = 0; i < klientAnzahl; i++ )
  202. {
  203. if( klients->z( i )->getKlientNummer() == klientId )
  204. {
  205. klients->z( i )->absturz();
  206. klients->remove( i );
  207. klientAnzahl--;
  208. gefunden = 1;
  209. break;
  210. }
  211. }
  212. LeaveCriticalSection( &cs );
  213. return gefunden;
  214. }
  215. bool NewsServer::removeKlient( NSKlient *zKlient )
  216. {
  217. bool gefunden = 0;
  218. EnterCriticalSection( &cs );
  219. for( int i = 0; i < klientAnzahl; i++ )
  220. {
  221. if( klients->z( i ) == zKlient )
  222. {
  223. klients->remove( i );
  224. klientAnzahl--;
  225. gefunden = 1;
  226. break;
  227. }
  228. }
  229. LeaveCriticalSection( &cs );
  230. return gefunden;
  231. }
  232. void NewsServer::addGesendet( int bytes )
  233. {
  234. gesendet += bytes;
  235. }
  236. void NewsServer::addEmpfangen( int bytes )
  237. {
  238. empfangen += bytes;
  239. }
  240. // constant
  241. bool NewsServer::istAn() const
  242. {
  243. return db->serverIstNichtPausiert( id );
  244. }
  245. Server *NewsServer::zServer() const
  246. {
  247. return server;
  248. }
  249. NSDatenbank *NewsServer::zDB() const
  250. {
  251. return db;
  252. }
  253. bool NewsServer::hatClients() const
  254. {
  255. return klientAnzahl > 0;
  256. }
  257. int NewsServer::getId() const
  258. {
  259. return id;
  260. }
  261. char *NewsServer::getLetzterFehler() const
  262. {
  263. return fehler->getText();
  264. }
  265. // Reference Counting
  266. NewsServer *NewsServer::getThis()
  267. {
  268. ref++;
  269. return this;
  270. }
  271. NewsServer *NewsServer::release()
  272. {
  273. ref--;
  274. if( !ref )
  275. delete this;
  276. return 0;
  277. }
  278. // Inhalt der NSAKlient Klasse aus NewsServer.h
  279. // Konstruktor
  280. NSAKlient::NSAKlient( SSLSKlient *klient, NewsServer *ns )
  281. : Thread()
  282. {
  283. this->klient = klient;
  284. name = new Text( "" );
  285. passwort = new Text( "" );
  286. adminId = 0;
  287. this->ns = ns;
  288. }
  289. // Destruktor
  290. NSAKlient::~NSAKlient()
  291. {
  292. klient->trenne();
  293. klient->release();
  294. ns->release();
  295. name->release();
  296. passwort->release();
  297. }
  298. // nicht constant
  299. void NSAKlient::thread()
  300. {
  301. while( 1 )
  302. {
  303. char c = 0;
  304. if( !klient->getNachricht( &c, 1 ) )
  305. break;
  306. else
  307. {
  308. bool br = 0;
  309. switch( c )
  310. {
  311. case 1: // Login
  312. if( 1 )
  313. {
  314. klient->sende( "\1", 1 );
  315. unsigned char nLen = 0;
  316. klient->getNachricht( (char*)&nLen, 1 );
  317. char *n = new char[ nLen + 1 ];
  318. n[ (int)nLen ] = 0;
  319. if( nLen )
  320. klient->getNachricht( n, nLen );
  321. unsigned char pLen = 0;
  322. klient->getNachricht( (char*)&pLen, 1 );
  323. char *p = new char[ pLen + 1 ];
  324. p[ (int)pLen ] = 0;
  325. if( pLen )
  326. klient->getNachricht( p, pLen );
  327. int adminId = ns->zDB()->istAdministrator( n, p );
  328. if( adminId )
  329. {
  330. klient->sende( "\1", 1 );
  331. name->setText( n );
  332. passwort->setText( p );
  333. this->adminId = adminId;
  334. }
  335. else
  336. errorZuKlient( "Falsche Kombination aus Name und Passwort." );
  337. delete[] n;
  338. delete[] p;
  339. }
  340. break;
  341. case 2: // Logout
  342. adminId = 0;
  343. name->setText( "" );
  344. passwort->setText( "" );
  345. klient->sende( "\1", 1 );
  346. break;
  347. case 3: // Trennen
  348. br = 1;
  349. klient->sende( "\1", 1 );
  350. break;
  351. case 4: // Server starten
  352. if( !adminId )
  353. errorZuKlient( "Du musst dich einloggen." );
  354. else
  355. {
  356. if( ns->zDB()->adminHatRecht( adminId, Admin_Recht::NSStarten ) )
  357. {
  358. if( !ns->serverStarten() )
  359. {
  360. Text *err = new Text();
  361. err->append( ns->getLetzterFehler() );
  362. errorZuKlient( err->getText() );
  363. err->release();
  364. }
  365. else
  366. klient->sende( "\1", 1 );
  367. }
  368. else
  369. errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
  370. }
  371. break;
  372. case 5: // Server beenden
  373. if( !adminId )
  374. errorZuKlient( "Du musst dich einloggen." );
  375. else
  376. {
  377. if( ns->zDB()->adminHatRecht( adminId, Admin_Recht::NSBeenden ) )
  378. {
  379. if( ns->serverBeenden() )
  380. klient->sende( "\1", 1 );
  381. else
  382. {
  383. Text *err = new Text();
  384. err->append( ns->getLetzterFehler() );
  385. errorZuKlient( err->getText() );
  386. err->release();
  387. }
  388. }
  389. else
  390. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  391. }
  392. break;
  393. case 6: // Programm Schließen
  394. if( !adminId )
  395. errorZuKlient( "Du musst dich einloggen." );
  396. else
  397. {
  398. bool ok = 0;
  399. if( ns->isRunning() )
  400. {
  401. if( ns->zDB()->adminHatRecht( adminId, Admin_Recht::NSBeenden ) )
  402. {
  403. if( ns->serverBeenden() )
  404. ok = 1;
  405. else
  406. {
  407. Text *err = new Text();
  408. err->append( ns->getLetzterFehler() );
  409. errorZuKlient( err->getText() );
  410. err->release();
  411. }
  412. }
  413. else
  414. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  415. }
  416. else
  417. ok = 1;
  418. if( ok && ns->hatClients() )
  419. {
  420. errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
  421. break;
  422. }
  423. if( ok )
  424. {
  425. klient->sende( "\1", 1 );
  426. std::cout << "NS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
  427. ns->close();
  428. br = 1;
  429. }
  430. }
  431. break;
  432. case 7: // Programm abstürzen
  433. if( !adminId )
  434. errorZuKlient( "Du musst dich einloggen." );
  435. else
  436. {
  437. bool ok = 0;
  438. if( ns->isRunning() )
  439. {
  440. if( ns->zDB()->adminHatRecht( adminId, Admin_Recht::NSBeenden ) )
  441. {
  442. ns->serverBeenden();
  443. ok = 1;
  444. }
  445. else
  446. errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
  447. }
  448. else
  449. ok = 1;
  450. if( ok )
  451. {
  452. klient->sende( "\1", 1 );
  453. std::cout << "NS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
  454. ns->close();
  455. br = 1;
  456. }
  457. }
  458. break;
  459. case 8: // Status Frage
  460. if( 1 )
  461. {
  462. char status = 0;
  463. if( ns->isRunning() )
  464. {
  465. status = 1;
  466. if( ns->istAn() )
  467. status = 2;
  468. }
  469. klient->sende( "\1", 1 );
  470. klient->sende( &status, 1 );
  471. }
  472. break;
  473. case 9: // Server pausieren
  474. if( !adminId )
  475. errorZuKlient( "Du musst dich einloggen." );
  476. else
  477. {
  478. klient->sende( "\1", 1 );
  479. char pause = 0;
  480. klient->getNachricht( &pause, 1 );
  481. if( ns->zDB()->adminHatRecht( adminId, Admin_Recht::NSPausieren ) )
  482. {
  483. bool ok = 0;
  484. if( pause )
  485. ok = ns->serverPause();
  486. else
  487. ok = ns->serverFortsetzen();
  488. if( ok )
  489. klient->sende( "\1", 1 );
  490. else
  491. {
  492. Text *err = new Text();
  493. err->append( ns->getLetzterFehler() );
  494. errorZuKlient( err->getText() );
  495. err->release();
  496. }
  497. }
  498. else
  499. {
  500. if( pause )
  501. errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
  502. else
  503. errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
  504. }
  505. }
  506. break;
  507. case 0xA: // maximale Anzahl der Clients setzen
  508. if( !adminId )
  509. errorZuKlient( "Du musst dich einloggen." );
  510. else
  511. {
  512. klient->sende( "\1", 1 );
  513. int maxC = 0;
  514. klient->getNachricht( (char*)&maxC, 4 );
  515. if( ns->zDB()->adminHatRecht( adminId, Admin_Recht::NSMCChange ) )
  516. {
  517. if( ns->setMaxKlients( maxC ) )
  518. klient->sende( "\1", 1 );
  519. else
  520. {
  521. Text *err = new Text();
  522. err->append( ns->getLetzterFehler() );
  523. errorZuKlient( err->getText() );
  524. err->release();
  525. }
  526. }
  527. else
  528. errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern." );
  529. }
  530. break;
  531. case 0xC: // klient absturtz
  532. if( 1 )
  533. {
  534. klient->sende( "\1", 1 );
  535. int klientId = 0;
  536. klient->getNachricht( (char*)&klientId, 4 );
  537. if( klientId && ns->absturzKlient( klientId ) )
  538. klient->sende( "\1", 1 );
  539. else
  540. klient->sende( "\0", 1 );
  541. }
  542. break;
  543. default:
  544. errorZuKlient( "Unbekannte Nachricht!" );
  545. break;
  546. }
  547. if( br )
  548. break;
  549. ns->addEmpfangen( klient->getDownloadBytes( 1 ) );
  550. ns->addGesendet( klient->getUploadBytes( 1 ) );
  551. }
  552. }
  553. ns->addEmpfangen( klient->getDownloadBytes( 1 ) );
  554. ns->addGesendet( klient->getUploadBytes( 1 ) );
  555. delete this;
  556. }
  557. void NSAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  558. {
  559. klient->sende( "\3", 1 );
  560. char len = (char)textLength( nachricht );
  561. klient->sende( &len, 1 );
  562. klient->sende( nachricht, len );
  563. }
  564. // Inhalt der NSKlient aus NewsServer.h
  565. // Konstruktor
  566. NSKlient::NSKlient( SKlient *klient, NewsServer *ns )
  567. : Thread()
  568. {
  569. this->klient = klient;
  570. unsigned char key[ 20 ] = { 4, 150, 243, 145, 204, 71, 253, 88, 4, 51, 189, 207, 189, 248, 231, 40, 106, 7, 182, 5 };
  571. klient->setSendeKey( (char*)key, 20 );
  572. klient->setEmpfangKey( (char*)key, 20 );
  573. klientNummer = 0;
  574. this->ns = ns;
  575. ref = 1;
  576. }
  577. // Destruktor
  578. NSKlient::~NSKlient()
  579. {
  580. klient->release();
  581. ns->release();
  582. }
  583. // nicht constant
  584. void NSKlient::absturz()
  585. {
  586. ende();
  587. klient->trenne();
  588. ns->zDB()->unregisterKlient( klientNummer, ns->getId() );
  589. }
  590. void NSKlient::thread()
  591. {
  592. while( 1 )
  593. {
  594. char c = 0;
  595. if( !klient->getNachrichtEncrypted( &c, 1 ) )
  596. break;
  597. else
  598. {
  599. bool br = 0;
  600. switch( c )
  601. {
  602. case 1: // Klient identifikation
  603. klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
  604. if( !ns->zDB()->proveKlient( klientNummer, ns->getId() ) )
  605. {
  606. klientNummer = 0;
  607. errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
  608. }
  609. else
  610. {
  611. Text *key = ns->zDB()->getKlientKey( klientNummer );
  612. if( !key )
  613. errorZuKlient( "Es konnte kein Key ermittelt werden." );
  614. else
  615. {
  616. klient->sendeEncrypted( "\1", 1 );
  617. klient->setEmpfangKey( *key, key->getLength() );
  618. klient->setSendeKey( *key, key->getLength() );
  619. key->release();
  620. }
  621. }
  622. break;
  623. case 2: // Main / Erhaltung Server message
  624. if( 1 )
  625. {
  626. char befehl = 0;
  627. klient->getNachrichtEncrypted( &befehl, 1 );
  628. switch( befehl )
  629. {
  630. case 2: // klient absturtz
  631. if( 1 )
  632. {
  633. int klientId = 0;
  634. klient->getNachrichtEncrypted( (char*)&klientId, 4 );
  635. if( klientId && ns->absturzKlient( klientId ) )
  636. klient->sendeEncrypted( "\1", 1 );
  637. else
  638. klient->sendeEncrypted( "\0", 1 );
  639. }
  640. break;
  641. default:
  642. errorZuKlient( "Befehl nicht bekannt!" );
  643. break;
  644. }
  645. }
  646. break;
  647. case 3: // Verbindungsende
  648. br = 1;
  649. klient->sendeEncrypted( "\1", 1 );
  650. break;
  651. case 4: // unregister Klient
  652. if( !klientNummer )
  653. {
  654. errorZuKlient( "Du bist nicht Identifiziert." );
  655. break;
  656. }
  657. ns->zDB()->unregisterKlient( klientNummer, ns->getId() );
  658. klient->sendeEncrypted( "\1", 1 );
  659. break;
  660. case 5: // frage nach Seite
  661. if( klientNummer )
  662. {
  663. klient->sendeEncrypted( "\1", 1 );
  664. unsigned char len = 0;
  665. klient->getNachrichtEncrypted( (char*)&len, 1 );
  666. char *n = new char[ len + 1 ];
  667. n[ (int)len ] = 0;
  668. klient->getNachrichtEncrypted( n, len );
  669. Text *pfad = new Text( "../news/" );
  670. pfad->append( n );
  671. delete[] n;
  672. if( !DateiExistiert( pfad->getText() ) )
  673. {
  674. errorZuKlient( "Die Seite ist nicht vorhanden." );
  675. pfad->release();
  676. break;
  677. }
  678. klient->sendeEncrypted( "\1", 1 );
  679. Datei *dat = new Datei();
  680. dat->setDatei( pfad );
  681. RCArray< Text > *list = dat->getDateiListe();
  682. int dAnz = list->getEintragAnzahl();
  683. for( int i = 0; i < dAnz; i++ )
  684. {
  685. if( DateiIstVerzeichnis( list->get( i ) ) || list->z( i )->istGleich( "." ) || list->z( i )->istGleich( ".." ) )
  686. {
  687. list->remove( i );
  688. dAnz--;
  689. i--;
  690. }
  691. }
  692. klient->sendeEncrypted( (char*)&dAnz, 4 );
  693. for( int i = 0; i < dAnz; i++ )
  694. {
  695. Text *pf = new Text( dat->zPfad()->getText() );
  696. pf->append( "/" );
  697. pf->append( list->z( i )->getText() );
  698. Datei *d = new Datei();
  699. d->setDatei( pf );
  700. d->open( Datei::Style::lesen );
  701. char nl = (char)list->z( i )->getLength();
  702. klient->sendeEncrypted( &nl, 1 );
  703. klient->sendeEncrypted( list->z( i )->getText(), nl );
  704. __int64 gr = d->getSize();
  705. klient->sendeEncrypted( (char*)&gr, 8 );
  706. char *bytes = new char[ 2048 ];
  707. while( gr > 0 )
  708. {
  709. int len = gr > 2048 ? 2048 : (int)gr;
  710. d->lese( bytes, len );
  711. klient->sende( bytes, len );
  712. gr -= len;
  713. }
  714. delete[] bytes;
  715. d->close();
  716. d->release();
  717. }
  718. list->release();
  719. dat->release();
  720. }
  721. else
  722. errorZuKlient( "Du bist nicht Identifiziert." );
  723. break;
  724. case 0x6: // ping
  725. if( 1 )
  726. {
  727. if( !klientNummer )
  728. {
  729. errorZuKlient( "Du bist nicht Identifiziert." );
  730. break;
  731. }
  732. klient->sendeEncrypted( "\1", 1 );
  733. }
  734. break;
  735. default:
  736. errorZuKlient( "Unbekannte Nachricht!" );
  737. break;
  738. }
  739. if( br )
  740. break;
  741. ns->addEmpfangen( klient->getDownloadBytes( 1 ) );
  742. ns->addGesendet( klient->getUploadBytes( 1 ) );
  743. }
  744. }
  745. ns->addEmpfangen( klient->getDownloadBytes( 1 ) );
  746. ns->addGesendet( klient->getUploadBytes( 1 ) );
  747. ns->removeKlient( this ); // delete this
  748. }
  749. // constant
  750. void NSKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
  751. {
  752. klient->sendeEncrypted( "\3", 1 );
  753. char len = (char)textLength( nachricht );
  754. klient->sendeEncrypted( &len, 1 );
  755. klient->sendeEncrypted( nachricht, len );
  756. }
  757. int NSKlient::getKlientNummer() const // gibt die KlientId zurück
  758. {
  759. return klientNummer;
  760. }
  761. // Reference Counting
  762. NSKlient *NSKlient::getThis()
  763. {
  764. ref++;
  765. return this;
  766. }
  767. NSKlient *NSKlient::release()
  768. {
  769. ref--;
  770. if( !ref )
  771. delete this;
  772. return 0;
  773. }