Server.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. #include "Server.h"
  2. #ifndef WIN32
  3. #include <string.h>
  4. #endif
  5. #include <Key.h>
  6. #include <Text.h>
  7. using namespace Network;
  8. // Inhalt der Server Klasse aus Server.h
  9. // Konstruktor
  10. Server::Server()
  11. {
  12. sock = 0;
  13. memset( &addresse, 0, sizeof( addresse ) ); // Adresse setzen
  14. addresse.sin_family = AF_INET;
  15. addresse.sin_addr.s_addr = ADDR_ANY;
  16. ref = 1;
  17. klients = 0;
  18. }
  19. // Destruktor
  20. Server::~Server()
  21. {
  22. trenne();
  23. }
  24. // nicht constant
  25. bool Server::verbinde( unsigned short port, int warteschlangenLen ) // Öffnet das Socket
  26. {
  27. sock = socket( AF_INET, SOCK_STREAM, 0 ); // Socket erstellen
  28. addresse.sin_port = htons( port ); // port setzen
  29. if( bind( sock, ( struct sockaddr* )&addresse, sizeof( addresse ) ) == -1 ) // socket öffnen
  30. return 0; // Fehler
  31. if( listen( sock, warteschlangenLen ) == -1 ) // Klients annehmen
  32. return 0; // Fehler
  33. return 1;
  34. }
  35. SKlient *Server::getKlient() // nimmt Klient an
  36. {
  37. if( !sock )
  38. return 0;
  39. sockaddr_in client;
  40. int len = sizeof( addresse );
  41. #ifdef WIN32
  42. SOCKET cls = accept( sock, (sockaddr*)&client, &len ); // Klient empfangen
  43. if( cls == INVALID_SOCKET )
  44. return 0;
  45. #else
  46. SOCKET cls = accept( sock, (sockaddr*)&client, (socklen_t*)&len ); // Klient empfangen
  47. if( !cls )
  48. return 0;
  49. #endif
  50. client.sin_port = addresse.sin_port;
  51. klients++;
  52. return new SKlient( client, cls ); // Klient Handle Klasse zurückgeben
  53. }
  54. int Server::getKlients( bool reset ) // gibt die Anzahl der Klients zurück
  55. {
  56. int ret = klients;
  57. if( reset )
  58. klients = 0;
  59. return ret;
  60. }
  61. bool Server::trenne() // beendet den Server
  62. {
  63. if( !sock )
  64. return 1;
  65. if( closesocket( sock ) < 0 ) // socket schließen
  66. return 0;
  67. sock = 0;
  68. return 1;
  69. }
  70. // constant
  71. unsigned short Server::getPort() const // gibt den Port zurück
  72. {
  73. return htons( addresse.sin_port );
  74. }
  75. // Reference Counting
  76. Server *Server::getThis()
  77. {
  78. ref++;
  79. return this;
  80. }
  81. Server *Server::release()
  82. {
  83. ref--;
  84. if( !ref )
  85. delete this;
  86. return 0;
  87. }
  88. // Inhalt der SKlient Klasse aus Server.h
  89. // Konstruktor
  90. SKlient::SKlient( sockaddr_in addresse, SOCKET sock )
  91. {
  92. clientAddr = addresse;
  93. this->sock = sock;
  94. ref = 1;
  95. downStreamBytes = 0;
  96. upStreamBytes = 0;
  97. sendeKey = 0;
  98. empfangKey = 0;
  99. }
  100. // Destruktor
  101. SKlient::~SKlient()
  102. {
  103. trenne();
  104. if( sendeKey )
  105. sendeKey->release();
  106. if( empfangKey )
  107. empfangKey->release();
  108. }
  109. // nicht constant
  110. void SKlient::setSendeKeyZ( Encryption::Key *key ) // Setzt den Key fürs Senden
  111. {
  112. if( sendeKey )
  113. sendeKey->release();
  114. sendeKey = key;
  115. }
  116. void SKlient::setEmpfangKeyZ( Encryption::Key *key ) // Setzt den Key fürs Empfangen
  117. {
  118. if( empfangKey )
  119. empfangKey->release();
  120. empfangKey = key;
  121. }
  122. void SKlient::setSendeKey( char *key, int len ) // Setzt den Key fürs Senden
  123. {
  124. if( !sendeKey )
  125. sendeKey = new Encryption::Key();
  126. sendeKey->setKey( key, len );
  127. }
  128. void SKlient::setEmpfangKey( char *key, int len ) // Setzt den Key fürs Empfangen
  129. {
  130. if( !empfangKey )
  131. empfangKey = new Encryption::Key();
  132. empfangKey->setKey( key, len );
  133. }
  134. bool SKlient::sende( const char *nachricht, int len ) // sendet zum Klient
  135. {
  136. if( !sock )
  137. return 0;
  138. int ll = 0;
  139. while( len > 0 )
  140. {
  141. #ifdef WIN32
  142. int l = send( sock, nachricht + ll, len, 0 );
  143. #else
  144. int l = (int)send( sock, nachricht + ll, len, MSG_NOSIGNAL );
  145. #endif
  146. if( l <= 0 )
  147. return 0; // Fehler
  148. len -= l;
  149. ll += l;
  150. }
  151. upStreamBytes += ll;
  152. return 1;
  153. }
  154. bool SKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht von Klient
  155. {
  156. if( !sock )
  157. return 0;
  158. int ll = 0;
  159. while( len > 0 )
  160. {
  161. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  162. if( l <= 0 )
  163. return 0; // Fehler
  164. len -= l;
  165. ll += l;
  166. }
  167. downStreamBytes += ll;
  168. return 1;
  169. }
  170. bool SKlient::sendeEncrypted( const char *nachricht, int len ) // sendet zum Server
  171. {
  172. if( !sendeKey )
  173. return sende( nachricht, len );
  174. Encryption::Bytes *n = new Encryption::Bytes( nachricht, len );
  175. sendeKey->codieren( n->getThis() ); int ll = 0;
  176. while( len > 0 )
  177. {
  178. #ifdef WIN32
  179. int l = send( sock, n->getBytes() + ll, len, 0 );
  180. #else
  181. int l = (int)send( sock, n->getBytes() + ll, len, MSG_NOSIGNAL );
  182. #endif
  183. if( l <= 0 )
  184. {
  185. n->release();
  186. return 0; // Fehler
  187. }
  188. len -= l;
  189. ll += l;
  190. }
  191. upStreamBytes += ll;
  192. n->release();
  193. return 1;
  194. }
  195. bool SKlient::getNachrichtEncrypted( char *nachricht, int len ) // empfängt Nachricht
  196. {
  197. if( !empfangKey )
  198. return getNachricht( nachricht, len );
  199. int ll = 0;
  200. while( len > 0 )
  201. {
  202. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  203. if( l <= 0 )
  204. return 0; // Fehler
  205. len -= l;
  206. ll += l;
  207. }
  208. Encryption::Bytes *n = new Encryption::Bytes();
  209. n->setBytesZ( nachricht, ll );
  210. empfangKey->decodieren( n );
  211. downStreamBytes += ll;
  212. return 1;
  213. }
  214. int SKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  215. {
  216. int ret = downStreamBytes;
  217. if( reset )
  218. downStreamBytes = 0;
  219. return ret;
  220. }
  221. int SKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  222. {
  223. int ret = upStreamBytes;
  224. if( reset )
  225. upStreamBytes = 0;
  226. return ret;
  227. }
  228. bool SKlient::trenne() // trennt die Verbindung zum Klient
  229. {
  230. if( !sock )
  231. return 0;
  232. if( closesocket( sock ) < 0 ) // trennen
  233. return 0;
  234. sock = 0;
  235. return 1;
  236. }
  237. // constant
  238. unsigned short SKlient::getPort() const // gibt den Port zurück
  239. {
  240. return htons( clientAddr.sin_port );
  241. }
  242. const char *SKlient::getIp() const // gibt die Ip des Klients zurück
  243. {
  244. return inet_ntoa( clientAddr.sin_addr );
  245. }
  246. // Reference Counting
  247. SKlient *SKlient::getThis()
  248. {
  249. ref++;
  250. return this;
  251. }
  252. SKlient *SKlient::release()
  253. {
  254. ref--;
  255. if( !ref )
  256. delete this;
  257. return 0;
  258. }
  259. int pem_passwd_cb( char *buf, int size, int rwflag, void *userdata )
  260. {
  261. const char *passw = ( (Text*)userdata )->getText();
  262. memcpy( buf, passw, MIN( (unsigned int)size, strlen( passw ) + 1 ) );
  263. return (int)strlen( buf );
  264. }
  265. // Inhalt der SSLServer Klasse
  266. // Konstruktor
  267. SSLServer::SSLServer()
  268. {
  269. s = 0;
  270. ctx = SSL_CTX_new( SSLv23_server_method() );
  271. SSL_CTX_set_default_passwd_cb( ctx, pem_passwd_cb );
  272. passw = new Text();
  273. SSL_CTX_set_default_passwd_cb_userdata( ctx, passw );
  274. addr.sin_family = AF_INET;
  275. addr.sin_addr.s_addr = htonl( INADDR_ANY );
  276. klients = 0;
  277. ref = 1;
  278. }
  279. // Destruktor
  280. SSLServer::~SSLServer()
  281. {
  282. trenne();
  283. passw->release();
  284. }
  285. // nicht constant
  286. // Setzt den Pfad zur Datei, in dem das Certifikat gespeichert ist
  287. bool SSLServer::setCertificateFile( const char *file )
  288. {
  289. return SSL_CTX_use_certificate_file( ctx, file, SSL_FILETYPE_PEM ) > 0;
  290. }
  291. // Setzt den Pfad zur Datei, in dem der private Schlüssel gespeichert ist
  292. bool SSLServer::setPrivateKeyFile( const char *file )
  293. {
  294. return SSL_CTX_use_PrivateKey_file( ctx, file, SSL_FILETYPE_PEM ) > 0;
  295. }
  296. // setzt das passwort des private keys (muss vor setPrivateKeyFile aufgerufen werden)
  297. void SSLServer::setPrivateKeyPassword( const char *password )
  298. {
  299. passw->setText( password );
  300. }
  301. // Öffnet das Socket
  302. bool SSLServer::verbinde( unsigned short port, int warteschlangenLen )
  303. {
  304. addr.sin_port = htons( port );
  305. s = socket( AF_INET, SOCK_STREAM, 0 );
  306. if( s < 0 )
  307. return 0;
  308. if( bind( s, ( struct sockaddr* )&addr, sizeof( addr ) ) < 0 )
  309. return 0;
  310. if( listen( s, warteschlangenLen ) < 0 )
  311. return 0;
  312. return 1;
  313. }
  314. // nimmt Klient an
  315. SSLSKlient *SSLServer::getKlient()
  316. {
  317. if( !s )
  318. return 0;
  319. int len = sizeof( addr );
  320. struct sockaddr_in addr;
  321. #ifdef WIN32
  322. SOCKET client = accept( s, ( struct sockaddr* )&addr, &len );
  323. if( client == INVALID_SOCKET )
  324. return 0;
  325. #else
  326. SOCKET client = accept( s, (sockaddr*)&addr, (socklen_t*)&len ); // Klient empfangen
  327. if( !client )
  328. return 0;
  329. #endif
  330. addr.sin_port = this->addr.sin_port;
  331. SSL *ssl = SSL_new( ctx );
  332. SSL_set_fd( ssl, (int)client );
  333. if( SSL_accept( ssl ) <= 0 )
  334. {
  335. SSL_free( ssl );
  336. closesocket( client );
  337. return 0;
  338. }
  339. klients++;
  340. return new SSLSKlient( addr, ssl, client );
  341. }
  342. // gibt die Anzahl der Klients zurück
  343. int SSLServer::getKlients( bool reset )
  344. {
  345. int ret = klients;
  346. if( reset )
  347. klients = 0;
  348. return ret;
  349. }
  350. // beendet den Server
  351. bool SSLServer::trenne()
  352. {
  353. if( !s )
  354. return 1;
  355. if( closesocket( s ) < 0 ) // socket schließen
  356. return 0;
  357. s = 0;
  358. return 1;
  359. }
  360. // constant
  361. // gibt den Port zurück
  362. unsigned short SSLServer::getPort() const
  363. {
  364. return htons( addr.sin_port );
  365. }
  366. // Reference Counting
  367. SSLServer *SSLServer::getThis()
  368. {
  369. ref++;
  370. return this;
  371. }
  372. SSLServer *SSLServer::release()
  373. {
  374. if( !--ref )
  375. delete this;
  376. return 0;
  377. }
  378. // Inhalt der SSLSKlient Klasse
  379. // Konstruktor
  380. SSLSKlient::SSLSKlient( sockaddr_in client, SSL *ssl, SOCKET s )
  381. {
  382. this->s = s;
  383. clientAddr = client;
  384. this->ssl = ssl;
  385. downStreamBytes = 0;
  386. upStreamBytes = 0;
  387. ref = 1;
  388. }
  389. // Destruktor
  390. SSLSKlient::~SSLSKlient()
  391. {
  392. trenne();
  393. }
  394. // nicht constant
  395. bool SSLSKlient::sende( const char *nachricht, int len ) // sendet zum Klient
  396. {
  397. if( !ssl )
  398. return 0;
  399. int ll = 0;
  400. while( len > 0 )
  401. {
  402. int l = SSL_write( ssl, nachricht + ll, len );
  403. if( l <= 0 )
  404. return 0; // Fehler
  405. len -= l;
  406. ll += l;
  407. }
  408. upStreamBytes += ll;
  409. return 1;
  410. }
  411. bool SSLSKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht von Klient
  412. {
  413. if( !ssl )
  414. return 0;
  415. int ll = 0;
  416. while( len > 0 )
  417. {
  418. int l = (int)SSL_read( ssl, nachricht + ll, len );
  419. if( l <= 0 )
  420. return 0; // Fehler
  421. len -= l;
  422. ll += l;
  423. }
  424. downStreamBytes += ll;
  425. return 1;
  426. }
  427. int SSLSKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  428. {
  429. int ret = downStreamBytes;
  430. if( reset )
  431. downStreamBytes = 0;
  432. return ret;
  433. }
  434. int SSLSKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  435. {
  436. int ret = upStreamBytes;
  437. if( reset )
  438. upStreamBytes = 0;
  439. return ret;
  440. }
  441. bool SSLSKlient::trenne() // trennt die Verbindung zum Klient
  442. {
  443. if( !ssl )
  444. return 0;
  445. SSL_free( ssl );
  446. if( closesocket( s ) < 0 ) // trennen
  447. return 0;
  448. ssl = 0;
  449. s = 0;
  450. return 1;
  451. }
  452. // constant
  453. unsigned short SSLSKlient::getPort() const // gibt den Port zurück
  454. {
  455. return htons( clientAddr.sin_port );
  456. }
  457. const char *SSLSKlient::getIp() const // gibt die Ip des Klients zurück
  458. {
  459. return inet_ntoa( clientAddr.sin_addr );
  460. }
  461. // Reference Counting
  462. SSLSKlient *SSLSKlient::getThis()
  463. {
  464. ref++;
  465. return this;
  466. }
  467. SSLSKlient *SSLSKlient::release()
  468. {
  469. if( !--ref )
  470. delete this;
  471. return 0;
  472. }