Server.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #include "Server.h"
  2. #include <iostream>
  3. #include <Klient.h>
  4. #include <Globals.h>
  5. #include <HttpRequest.h>
  6. #include <JSON.h>
  7. // Inhalt der LoginServer Klasse aus LoginServer.h
  8. // Konstruktor
  9. FactoryCraftServer::FactoryCraftServer( InitDatei *zIni )
  10. : ReferenceCounter()
  11. {
  12. Network::Start( 100 );
  13. klientAnzahl = 0;
  14. klients = new RCArray< FCKlient >();
  15. empfangen = 0;
  16. gesendet = 0;
  17. ini = dynamic_cast<InitDatei *>( zIni->getThis() );
  18. id = *zIni->zWert( "ServerId" );
  19. server = new SSLServer();
  20. server->setPrivateKeyPassword( zIni->zWert( "SSLPasswort" )->getText() );
  21. server->setCertificateFile( zIni->zWert( "SSLCert" )->getText() );
  22. std::cout << "using cert file " << zIni->zWert( "SSLCert" )->getText() << "\n";
  23. server->setPrivateKeyFile( zIni->zWert( "SSLKey" )->getText() );
  24. std::cout << "using private key " << zIni->zWert( "SSLKey" )->getText() << "\n";
  25. game = new Game( zIni->zWert( "World" )->getText(), zIni->zWert( "SaveDir" )->getText() );
  26. InitializeCriticalSection( &cs );
  27. }
  28. // Destruktor
  29. FactoryCraftServer::~FactoryCraftServer()
  30. {
  31. server->trenne();
  32. server->release();
  33. if( klients )
  34. klients->release();
  35. ini->release();
  36. game->requestStop();
  37. game->release();
  38. DeleteCriticalSection( &cs );
  39. }
  40. // nicht constant
  41. void FactoryCraftServer::run()
  42. {
  43. if( !server->verbinde( (unsigned short)TextZuInt( ini->zWert( "SSLPort" )->getText(), 10 ), 10 ) )
  44. std::cout << "Der Server konnte nicht gestartet werden.\n";
  45. else
  46. std::cout << "Server Port: " << ini->zWert( "SSLPort" )->getText() << "\n";
  47. while( server->isConnected() )
  48. {
  49. SSLSKlient *klient = server->getKlient();
  50. if( !klient )
  51. continue;
  52. Framework::getThreadRegister()->cleanUpClosedThreads();
  53. FCKlient *clHandle = new FCKlient( klient, dynamic_cast<FactoryCraftServer *>( getThis() ) );
  54. EnterCriticalSection( &cs );
  55. klients->set( clHandle, klientAnzahl );
  56. klientAnzahl++;
  57. LeaveCriticalSection( &cs );
  58. clHandle->start();
  59. }
  60. }
  61. void FactoryCraftServer::close()
  62. {
  63. server->trenne();
  64. EnterCriticalSection( &cs );
  65. for( int i = 0; i < klientAnzahl; i++ )
  66. klients->z( i )->absturz();
  67. klients = ( RCArray< FCKlient > * )klients->release();
  68. klientAnzahl = 0;
  69. game->save();
  70. LeaveCriticalSection( &cs );
  71. }
  72. bool FactoryCraftServer::absturzKlient( int accountId )
  73. {
  74. bool gefunden = 0;
  75. EnterCriticalSection( &cs );
  76. for( int i = 0; i < klientAnzahl; i++ )
  77. {
  78. if( klients->z( i ) && klients->z( i )->getAccountId() == accountId )
  79. {
  80. klients->z( i )->absturz();
  81. klients->remove( i );
  82. klientAnzahl--;
  83. gefunden = 1;
  84. break;
  85. }
  86. }
  87. LeaveCriticalSection( &cs );
  88. return gefunden;
  89. }
  90. bool FactoryCraftServer::removeKlient( FCKlient *zKlient )
  91. {
  92. bool gefunden = 0;
  93. EnterCriticalSection( &cs );
  94. for( int i = 0; i < klientAnzahl; i++ )
  95. {
  96. if( klients->z( i ) == zKlient )
  97. {
  98. klients->remove( i );
  99. klientAnzahl--;
  100. gefunden = 1;
  101. break;
  102. }
  103. }
  104. LeaveCriticalSection( &cs );
  105. return gefunden;
  106. }
  107. void FactoryCraftServer::addGesendet( int bytes )
  108. {
  109. gesendet += bytes;
  110. }
  111. void FactoryCraftServer::addEmpfangen( int bytes )
  112. {
  113. empfangen += bytes;
  114. }
  115. bool FactoryCraftServer::hatClients() const
  116. {
  117. return klientAnzahl > 0;
  118. }
  119. Game *FactoryCraftServer::zGame() const
  120. {
  121. return game;
  122. }
  123. // Inhalt der LSKlient aus LoginServer.h
  124. // Konstruktor
  125. FCKlient::FCKlient( SSLSKlient *klient, FactoryCraftServer *ls )
  126. : Thread()
  127. {
  128. this->klient = klient;
  129. accountId = 0;
  130. this->ls = ls;
  131. reader = new NetworkReader( klient );
  132. writer = new NetworkWriter( klient );
  133. }
  134. // Destruktor
  135. FCKlient::~FCKlient()
  136. {
  137. if( zGameClient )
  138. {
  139. zGameClient->logout();
  140. zGameClient = (GameClient *)zGameClient->release();
  141. }
  142. delete reader;
  143. delete writer;
  144. klient->release();
  145. ls->release();
  146. }
  147. // nicht constant
  148. void FCKlient::absturz()
  149. {
  150. ende();
  151. klient->trenne();
  152. }
  153. void FCKlient::thread()
  154. {
  155. while( 1 )
  156. {
  157. char c = 0;
  158. if( !klient->getNachricht( &c, 1 ) )
  159. break;
  160. else
  161. {
  162. bool br = 0;
  163. switch( c )
  164. {
  165. case 1: // Klient identifikation
  166. {
  167. int accountId = 0;
  168. klient->getNachricht( (char *)&accountId, 4 );
  169. unsigned char secretLength = 0;
  170. klient->getNachricht( (char *)&secretLength, 1 );
  171. char *secret = new char[ secretLength + 1 ];
  172. klient->getNachricht( secret, (int)secretLength );
  173. secret[ secretLength ] = 0;
  174. Text data = "{\"account_id\":";
  175. data += accountId;
  176. data += ", \"secret\": \"";
  177. data += secret;
  178. data += "\"}";
  179. bool ok = false;
  180. HTTP::Answer *answer = HTTP::PostRequest( "/game_client/api/verify_client.php", "koljastrohm-games.com", data, "application/json", 443, true ).execute();
  181. if( answer->getStatusCode() == 200 )
  182. {
  183. JSON::JSONObject obj( answer->getData() );
  184. if( obj.hasValue( "verified" ) )
  185. {
  186. JSON::JSONValue *value = obj.getValue( "verified" );
  187. if( value->getType() == JSON::BOOLEAN )
  188. {
  189. if( ( (JSON::JSONBool *)value )->getBool() )
  190. {
  191. this->accountId = accountId;
  192. if( zGameClient )
  193. {
  194. zGameClient->logout();
  195. zGameClient = (GameClient *)zGameClient->release();
  196. }
  197. klient->sende( "\1", 1 );
  198. zGameClient = ls->zGame()->addPlayer( dynamic_cast<FCKlient *>( getThis() ), Text( accountId ) );
  199. ok = true;
  200. }
  201. }
  202. value->release();
  203. }
  204. }
  205. answer->release();
  206. delete[]secret;
  207. if( !ok )
  208. klient->sende( "\0", 1 );
  209. break;
  210. }
  211. case 2: // Verbindungsende
  212. br = 1;
  213. if( zGameClient )
  214. {
  215. zGameClient->logout();
  216. zGameClient = (GameClient *)zGameClient->release();
  217. }
  218. klient->sende( "\1", 1 );
  219. break;
  220. default:
  221. if( zGameClient )
  222. zGameClient->addMessage( reader );
  223. break;
  224. }
  225. if( br )
  226. break;
  227. ls->addEmpfangen( klient->getDownloadBytes( 1 ) );
  228. ls->addGesendet( klient->getUploadBytes( 1 ) );
  229. }
  230. }
  231. ls->addEmpfangen( klient->getDownloadBytes( 1 ) );
  232. ls->addGesendet( klient->getUploadBytes( 1 ) );
  233. ls->removeKlient( this ); // delete this
  234. }
  235. int FCKlient::getAccountId() const // gibt die KlientId zurück
  236. {
  237. return accountId;
  238. }
  239. SSLSKlient *FCKlient::zClient() const
  240. {
  241. return klient;
  242. }
  243. NetworkWriter *FCKlient::zWriter() const
  244. {
  245. return writer;
  246. }