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 Server();
  22. std::cout << "IS: Starten des Admin Servers...\n";
  23. if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
  24. {
  25. std::cout << "IS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
  26. exit( 1 );
  27. }
  28. db->setServerStatus( id, 2 );
  29. end = 0;
  30. nichtPausiert = 0;
  31. InitializeCriticalSection( &cs );
  32. ref = 1;
  33. if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
  34. {
  35. serverStarten();
  36. serverFortsetzen();
  37. }
  38. }
  39. // Destruktor
  40. NewsServer::~NewsServer()
  41. {
  42. fehler->release();
  43. server->trenne();
  44. server->release();
  45. aServer->trenne();
  46. aServer->release();
  47. if( klients )
  48. klients->release();
  49. ini->release();
  50. db->release();
  51. DeleteCriticalSection( &cs );
  52. }
  53. // nicht constant
  54. void NewsServer::runn()
  55. {
  56. while( !end )
  57. {
  58. SKlient *klient;
  59. klient = aServer->getKlient();
  60. if( end && klient )
  61. {
  62. klient->trenne();
  63. klient = klient->release();
  64. Sleep( 1000 );
  65. return;
  66. }
  67. if( !klient )
  68. return;
  69. NSAKlient *clHandle = new NSAKlient( klient, getThis() );
  70. clHandle->start();
  71. }
  72. }
  73. void NewsServer::thread()
  74. {
  75. while( 1 )
  76. {
  77. SKlient *klient;
  78. klient = server->getKlient();
  79. if( !klient )
  80. break;
  81. Framework::getThreadRegister()->cleanUpClosedThreads();
  82. NSKlient *clHandle = new NSKlient( klient, getThis() );
  83. EnterCriticalSection( &cs );
  84. klients->set( clHandle, klientAnzahl );
  85. klientAnzahl++;
  86. LeaveCriticalSection( &cs );
  87. clHandle->start();
  88. }
  89. }
  90. void NewsServer::close()
  91. {
  92. db->setServerStatus( id, 1 );
  93. server->trenne();
  94. #ifdef WIN32
  95. warteAufThread( 1000 );
  96. #endif
  97. EnterCriticalSection( &cs );
  98. for( int i = 0; i < klientAnzahl; i++ )
  99. klients->z( i )->absturz();
  100. klients = klients->release();
  101. klientAnzahl = 0;
  102. LeaveCriticalSection( &cs );
  103. ende();
  104. run = 0;
  105. end = 1;
  106. Klient *klient = new Klient();
  107. klient->verbinde( aServer->getPort(), "127.0.0.1" );
  108. Sleep( 500 );
  109. aServer->trenne();
  110. klient->release();
  111. }
  112. bool NewsServer::serverStarten()
  113. {
  114. if( nichtPausiert )
  115. {
  116. fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
  117. return 0;
  118. }
  119. if( server )
  120. server->release();
  121. server = new Server();
  122. if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
  123. {
  124. nichtPausiert = 1;
  125. start();
  126. return 1;
  127. }
  128. else
  129. {
  130. serverBeenden();
  131. fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
  132. return 0;
  133. }
  134. }
  135. bool NewsServer::serverPause()
  136. {
  137. if( !nichtPausiert )
  138. {
  139. fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
  140. return 0;
  141. }
  142. if( !db->setServerStatus( id, 2 ) )
  143. {
  144. fehler->setText( "Der Server konnte nicht pausiert werden: " );
  145. fehler->append( db->getLetzterFehler() );
  146. return 0;
  147. }
  148. return 1;
  149. }
  150. bool NewsServer::serverFortsetzen()
  151. {
  152. if( !nichtPausiert )
  153. {
  154. fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
  155. return 0;
  156. }
  157. if( !db->setServerStatus( id, 3 ) )
  158. {
  159. fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
  160. fehler->append( db->getLetzterFehler() );
  161. return 0;
  162. }
  163. return 1;
  164. }
  165. bool NewsServer::serverBeenden()
  166. {
  167. if( !nichtPausiert )
  168. {
  169. fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
  170. return 0;
  171. }
  172. if( db->serverIstNichtPausiert( id ) )
  173. {
  174. fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
  175. return 0;
  176. }
  177. nichtPausiert = 0;
  178. ende();
  179. if( server )
  180. server->trenne();
  181. return 1;
  182. }
  183. bool NewsServer::setMaxKlients( int mc )
  184. {
  185. if( !db->setMaxClients( id, mc ) )
  186. {
  187. fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
  188. fehler->append( db->getLetzterFehler() );
  189. return 0;
  190. }
  191. ini->setWert( "MaxClients", Text() += mc );
  192. return 1;
  193. }
  194. bool NewsServer::absturzKlient( int klientId )
  195. {
  196. bool gefunden = 0;
  197. EnterCriticalSection( &cs );
  198. for( int i = 0; i < klientAnzahl; i++ )
  199. {
  200. if( klients->z( i )->getKlientNummer() == klientId )
  201. {
  202. klients->z( i )->absturz();
  203. klients->remove( i );
  204. klientAnzahl--;
  205. gefunden = 1;
  206. break;
  207. }
  208. }
  209. LeaveCriticalSection( &cs );
  210. return gefunden;
  211. }
  212. bool NewsServer::removeKlient( NSKlient *zKlient )
  213. {
  214. bool gefunden = 0;
  215. EnterCriticalSection( &cs );
  216. for( int i = 0; i < klientAnzahl; i++ )
  217. {
  218. if( klients->z( i ) == zKlient )
  219. {
  220. klients->remove( i );
  221. klientAnzahl--;
  222. gefunden = 1;
  223. break;
  224. }
  225. }
  226. LeaveCriticalSection( &cs );
  227. return gefunden;
  228. }
  229. void NewsServer::addGesendet( int bytes )
  230. {
  231. gesendet += bytes;
  232. }
  233. void NewsServer::addEmpfangen( int bytes )
  234. {
  235. empfangen += bytes;
  236. }
  237. // constant
  238. bool NewsServer::istAn() const
  239. {
  240. return db->serverIstNichtPausiert( id );
  241. }
  242. Server *NewsServer::zServer() const
  243. {
  244. return server;
  245. }
  246. NSDatenbank *NewsServer::zDB() const
  247. {
  248. return db;
  249. }
  250. bool NewsServer::hatClients() const
  251. {
  252. return klientAnzahl > 0;
  253. }
  254. int NewsServer::getId() const
  255. {
  256. return id;
  257. }
  258. char *NewsServer::getLetzterFehler() const
  259. {
  260. return fehler->getText();
  261. }
  262. // Reference Counting
  263. NewsServer *NewsServer::getThis()
  264. {
  265. ref++;
  266. return this;
  267. }
  268. NewsServer *NewsServer::release()
  269. {
  270. ref--;
  271. if( !ref )
  272. delete this;
  273. return 0;
  274. }
  275. // Inhalt der NSAKlient Klasse aus NewsServer.h
  276. // Konstruktor
  277. NSAKlient::NSAKlient( SKlient *klient, NewsServer *ns )
  278. : Thread()
  279. {
  280. this->klient = klient;
  281. unsigned char key[ 20 ] = { 118, 24, 81, 121, 254, 35, 132, 34, 118, 165, 132, 212, 137, 41, 253, 153, 239, 26, 1, 72 };
  282. klient->setSendeKey( (char*)key, 20 );
  283. klient->setEmpfangKey( (char*)key, 20 );
  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->getNachrichtEncrypted( &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->sendeEncrypted( "\1", 1 );
  315. char nLen = 0;
  316. klient->getNachrichtEncrypted( &nLen, 1 );
  317. char *n = new char[ nLen + 1 ];
  318. n[ (int)nLen ] = 0;
  319. if( nLen )
  320. klient->getNachrichtEncrypted( n, nLen );
  321. char pLen = 0;
  322. klient->getNachrichtEncrypted( &pLen, 1 );
  323. char *p = new char[ pLen + 1 ];
  324. p[ (int)pLen ] = 0;
  325. if( pLen )
  326. klient->getNachrichtEncrypted( p, pLen );
  327. int adminId = ns->zDB()->istAdministrator( n, p );
  328. if( adminId )
  329. {
  330. klient->sendeEncrypted( "\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->sendeEncrypted( "\1", 1 );
  346. break;
  347. case 3: // Trennen
  348. br = 1;
  349. klient->sendeEncrypted( "\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->sendeEncrypted( "\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->sendeEncrypted( "\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->sendeEncrypted( "\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->sendeEncrypted( "\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->sendeEncrypted( "\1", 1 );
  470. klient->sendeEncrypted( &status, 1 );
  471. }
  472. break;
  473. case 9: // Server pausieren
  474. if( !adminId )
  475. errorZuKlient( "Du musst dich einloggen." );
  476. else
  477. {
  478. klient->sendeEncrypted( "\1", 1 );
  479. char pause = 0;
  480. klient->getNachrichtEncrypted( &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->sendeEncrypted( "\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->sendeEncrypted( "\1", 1 );
  513. int maxC = 0;
  514. klient->getNachrichtEncrypted( (char*)&maxC, 4 );
  515. if( ns->zDB()->adminHatRecht( adminId, Admin_Recht::NSMCChange ) )
  516. {
  517. if( ns->setMaxKlients( maxC ) )
  518. klient->sendeEncrypted( "\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->sendeEncrypted( "\1", 1 );
  535. int klientId = 0;
  536. klient->getNachrichtEncrypted( (char*)&klientId, 4 );
  537. if( klientId && ns->absturzKlient( klientId ) )
  538. klient->sendeEncrypted( "\1", 1 );
  539. else
  540. klient->sendeEncrypted( "\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->sendeEncrypted( "\3", 1 );
  560. char len = (char)textLength( nachricht );
  561. klient->sendeEncrypted( &len, 1 );
  562. klient->sendeEncrypted( 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. char len = 0;
  665. klient->getNachrichtEncrypted( &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. }