Server.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. #include "Server.h"
  2. #include <openssl/err.h>
  3. #include <openssl/ssl.h>
  4. #ifndef WIN32
  5. # include <string.h>
  6. #endif
  7. #include <iostream>
  8. #include <Key.h>
  9. #include <Logging.h>
  10. #include <Text.h>
  11. using namespace Network;
  12. // Inhalt der Server Klasse aus Server.h
  13. // Konstruktor
  14. Server::Server()
  15. : ReferenceCounter()
  16. {
  17. sock = 0;
  18. memset(&addresse, 0, sizeof(addresse)); // Adresse setzen
  19. addresse.sin_family = AF_INET;
  20. addresse.sin_addr.s_addr = ADDR_ANY;
  21. klients = 0;
  22. }
  23. // Destruktor
  24. Server::~Server()
  25. {
  26. trenne();
  27. }
  28. // nicht constant
  29. bool Server::verbinde(
  30. unsigned short port, int warteschlangenLen) // Öffnet das Socket
  31. {
  32. sock = socket(AF_INET, SOCK_STREAM, 0); // Socket erstellen
  33. addresse.sin_port = htons(port); // port setzen
  34. if (sock < 0)
  35. {
  36. sock = 0;
  37. return 0;
  38. }
  39. #ifdef WIN32
  40. char reuseSocket = 1;
  41. setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseSocket, sizeof(char));
  42. #else
  43. int reuseSocket = 1;
  44. setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseSocket, sizeof(int));
  45. #endif
  46. if (bind(sock, (struct sockaddr*)&addresse, sizeof(addresse))
  47. == -1) // socket öffnen
  48. {
  49. trenne();
  50. return 0; // Fehler
  51. }
  52. if (listen(sock, warteschlangenLen) == -1) // Klients annehmen
  53. {
  54. trenne();
  55. return 0; // Fehler
  56. }
  57. return 1;
  58. }
  59. SKlient* Server::getKlient() // nimmt Klient an
  60. {
  61. if (!sock) return 0;
  62. sockaddr_in client;
  63. int len = sizeof(addresse);
  64. fd_set set;
  65. int rv = 0;
  66. struct timeval timeout;
  67. while (rv == 0 && sock)
  68. {
  69. FD_ZERO(&set); /* clear the set */
  70. FD_SET(sock, &set); /* add our file descriptor to the set */
  71. timeout.tv_sec = 10;
  72. timeout.tv_usec = 0;
  73. rv = select((int)sock + 1, &set, NULL, NULL, &timeout);
  74. if (rv == -1) return 0;
  75. }
  76. if (!sock) return 0;
  77. #ifdef WIN32
  78. SOCKET cls = accept(sock, (sockaddr*)&client, &len); // Klient empfangen
  79. if (cls == INVALID_SOCKET)
  80. {
  81. trenne();
  82. return 0;
  83. }
  84. #else
  85. SOCKET cls = accept(
  86. sock, (sockaddr*)&client, (socklen_t*)&len); // Klient empfangen
  87. if (!cls)
  88. {
  89. if (errno == ECONNABORTED || errno == EBADF) trenne();
  90. return 0;
  91. }
  92. #endif
  93. client.sin_port = addresse.sin_port;
  94. klients++;
  95. return new SKlient(client, cls); // Klient Handle Klasse zurückgeben
  96. }
  97. int Server::getKlients(bool reset) // gibt die Anzahl der Klients zurück
  98. {
  99. int ret = klients;
  100. if (reset) klients = 0;
  101. return ret;
  102. }
  103. bool Server::trenne() // beendet den Server
  104. {
  105. if (!sock) return 1;
  106. if (closesocket(sock) < 0) // socket schließen
  107. return 0;
  108. sock = 0;
  109. return 1;
  110. }
  111. // constant
  112. unsigned short Server::getPort() const // gibt den Port zurück
  113. {
  114. return htons(addresse.sin_port);
  115. }
  116. bool Server::isConnected()
  117. const // giebt 1 zurück, falls der Server verbunden ist
  118. {
  119. return sock != 0;
  120. }
  121. // Inhalt der SKlient Klasse aus Server.h
  122. // Konstruktor
  123. SKlient::SKlient(sockaddr_in addresse, SOCKET sock)
  124. : ReferenceCounter()
  125. {
  126. clientAddr = addresse;
  127. this->sock = sock;
  128. downStreamBytes = 0;
  129. upStreamBytes = 0;
  130. sendeKey = 0;
  131. empfangKey = 0;
  132. }
  133. // Destruktor
  134. SKlient::~SKlient()
  135. {
  136. trenne();
  137. if (sendeKey) sendeKey->release();
  138. if (empfangKey) empfangKey->release();
  139. }
  140. // nicht constant
  141. void SKlient::setEmpfangTimeout(
  142. int miliseconds) // Setzt ein timeout fürs empfangen von daten
  143. {
  144. #ifdef WIN32
  145. DWORD timeout = miliseconds;
  146. setsockopt(
  147. sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
  148. #else
  149. struct timeval tv;
  150. tv.tv_sec = miliseconds / 1000;
  151. tv.tv_usec = (miliseconds % 1000) * 1000;
  152. setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
  153. #endif
  154. }
  155. void SKlient::setSendeKeyZ(Encryption::Key* key) // Setzt den Key fürs Senden
  156. {
  157. if (sendeKey) sendeKey->release();
  158. sendeKey = key;
  159. }
  160. void SKlient::setEmpfangKeyZ(
  161. Encryption::Key* key) // Setzt den Key fürs Empfangen
  162. {
  163. if (empfangKey) empfangKey->release();
  164. empfangKey = key;
  165. }
  166. void SKlient::setSendeKey(const char* key, int len) // Setzt den Key fürs Senden
  167. {
  168. if (!sendeKey) sendeKey = new Encryption::Key();
  169. sendeKey->setKey(key, len);
  170. }
  171. void SKlient::setEmpfangKey(
  172. const char* key, int len) // Setzt den Key fürs Empfangen
  173. {
  174. if (!empfangKey) empfangKey = new Encryption::Key();
  175. empfangKey->setKey(key, len);
  176. }
  177. bool SKlient::sende(const char* nachricht, int len) // sendet zum Klient
  178. {
  179. if (!sock) return 0;
  180. int ll = 0;
  181. while (len > 0)
  182. {
  183. #ifdef WIN32
  184. int l = send(sock, nachricht + ll, len, 0);
  185. #else
  186. int l = (int)send(sock, nachricht + ll, len, MSG_NOSIGNAL);
  187. #endif
  188. if (l <= 0)
  189. {
  190. #ifdef WIN32
  191. # ifdef _DEBUG
  192. Framework::Logging::warning()
  193. << "send: " << l << " Error: " << WSAGetLastError();
  194. # endif
  195. #endif
  196. return 0; // Fehler
  197. }
  198. len -= l;
  199. ll += l;
  200. }
  201. upStreamBytes += ll;
  202. return 1;
  203. }
  204. bool SKlient::getNachricht(
  205. char* nachricht, int len) // empfängt Nachricht von Klient
  206. {
  207. if (!sock) return 0;
  208. int ll = 0;
  209. while (len > 0)
  210. {
  211. int l = (int)recv(sock, nachricht + ll, len, MSG_WAITALL);
  212. if (l <= 0)
  213. {
  214. #ifdef WIN32
  215. # ifdef _DEBUG
  216. Framework::Logging::warning()
  217. << "recv: " << l << " Error: " << WSAGetLastError();
  218. # endif
  219. #endif
  220. return 0; // Fehler
  221. }
  222. len -= l;
  223. ll += l;
  224. }
  225. downStreamBytes += ll;
  226. return 1;
  227. }
  228. bool SKlient::sendeEncrypted(
  229. const char* nachricht, int len) // sendet zum Server
  230. {
  231. if (!sendeKey) return sende(nachricht, len);
  232. Encryption::Bytes* n = new Encryption::Bytes(nachricht, len);
  233. sendeKey->codieren(dynamic_cast<Encryption::Bytes*>(n->getThis()));
  234. int ll = 0;
  235. while (len > 0)
  236. {
  237. #ifdef WIN32
  238. int l = send(sock, n->getBytes() + ll, len, 0);
  239. #else
  240. int l = (int)send(sock, n->getBytes() + ll, len, MSG_NOSIGNAL);
  241. #endif
  242. if (l <= 0)
  243. {
  244. #ifdef WIN32
  245. # ifdef _DEBUG
  246. Framework::Logging::warning()
  247. << "send: " << l << " Error: " << WSAGetLastError();
  248. # endif
  249. #endif
  250. n->release();
  251. return 0; // Fehler
  252. }
  253. len -= l;
  254. ll += l;
  255. }
  256. upStreamBytes += ll;
  257. n->release();
  258. return 1;
  259. }
  260. bool SKlient::getNachrichtEncrypted(
  261. char* nachricht, int len) // empfängt Nachricht
  262. {
  263. if (!empfangKey) return getNachricht(nachricht, len);
  264. int ll = 0;
  265. while (len > 0)
  266. {
  267. int l = (int)recv(sock, nachricht + ll, len, MSG_WAITALL);
  268. if (l <= 0)
  269. {
  270. #ifdef WIN32
  271. # ifdef _DEBUG
  272. Framework::Logging::warning()
  273. << "recv: " << l << " Error: " << WSAGetLastError();
  274. # endif
  275. #endif
  276. return 0; // Fehler
  277. }
  278. len -= l;
  279. ll += l;
  280. }
  281. Encryption::Bytes* n = new Encryption::Bytes();
  282. n->setBytesZ(nachricht, ll);
  283. empfangKey->decodieren(n);
  284. downStreamBytes += ll;
  285. return 1;
  286. }
  287. int SKlient::getDownloadBytes(
  288. bool reset) // gibt die anzahl von empfangen bytes zurück
  289. {
  290. int ret = downStreamBytes;
  291. if (reset) downStreamBytes = 0;
  292. return ret;
  293. }
  294. int SKlient::getUploadBytes(
  295. bool reset) // gibt die anzahl von versendeter bytes zurück
  296. {
  297. int ret = upStreamBytes;
  298. if (reset) upStreamBytes = 0;
  299. return ret;
  300. }
  301. bool SKlient::trenne() // trennt die Verbindung zum Klient
  302. {
  303. if (!sock) return 0;
  304. if (closesocket(sock) < 0) // trennen
  305. return 0;
  306. sock = 0;
  307. return 1;
  308. }
  309. // constant
  310. bool SKlient::hatNachricht(
  311. int zeit) const // Wartet eine Zeit Lang auf eine Nachricht
  312. {
  313. fd_set set;
  314. FD_ZERO(&set);
  315. FD_SET(sock, &set);
  316. timeval time = {zeit / 1000, zeit};
  317. int result = select(0, &set, 0, 0, &time);
  318. if (result < 0)
  319. {
  320. #ifdef WIN32
  321. # ifdef _DEBUG
  322. Framework::Logging::warning()
  323. << "select: " << result << " Error: " << WSAGetLastError();
  324. # endif
  325. #endif
  326. }
  327. return result > 0;
  328. }
  329. unsigned short SKlient::getPort() const // gibt den Port zurück
  330. {
  331. return htons(clientAddr.sin_port);
  332. }
  333. const char* SKlient::getIp() const // gibt die Ip des Klients zurück
  334. {
  335. return inet_ntoa(clientAddr.sin_addr);
  336. }
  337. int pem_passwd_cb(char* buf, int size, int rwflag, void* userdata)
  338. {
  339. const char* passw = ((Text*)userdata)->getText();
  340. memcpy(buf, passw, MIN((unsigned int)size, strlen(passw) + 1));
  341. return (int)strlen(buf);
  342. }
  343. bool SSLErrorCheck(int result, SSL* ssl, const char* action)
  344. {
  345. if (result <= 0)
  346. {
  347. Framework::Logging::error()
  348. << "'" << action
  349. << "' returned error code: " << SSL_get_error(ssl, result);
  350. return 0;
  351. }
  352. return 1;
  353. }
  354. bool SSLErrorCheck(__int64 result, const char* action)
  355. {
  356. if (result <= 0)
  357. {
  358. unsigned long error = ERR_get_error();
  359. Framework::Logging::error() << "'" << action << "' returned " << result
  360. << " error code: " << error << "("
  361. << ERR_reason_error_string(error) << ")";
  362. return 0;
  363. }
  364. return 1;
  365. }
  366. bool SKlient::waitForNextMessage()
  367. const // wartet bis es etwas zu empfangen gibt
  368. {
  369. fd_set set;
  370. int rv = 0;
  371. struct timeval timeout;
  372. while (rv == 0 && sock)
  373. {
  374. FD_ZERO(&set); /* clear the set */
  375. FD_SET(sock, &set); /* add our file descriptor to the set */
  376. timeout.tv_sec = 10;
  377. timeout.tv_usec = 0;
  378. rv = select((int)sock + 1, &set, NULL, NULL, &timeout);
  379. if (rv == -1)
  380. {
  381. #ifdef WIN32
  382. # ifdef _DEBUG
  383. Framework::Logging::warning()
  384. << "select: " << rv << " Error: " << WSAGetLastError();
  385. # endif
  386. #endif
  387. return 0;
  388. }
  389. }
  390. if (!sock) return 0;
  391. char c;
  392. #ifdef WIN32
  393. int l = (int)recv(sock, &c, 1, MSG_PEEK);
  394. #else
  395. int l = (int)recv(sock, &c, 1, MSG_WAITALL | MSG_PEEK);
  396. #endif
  397. if (l <= 0)
  398. {
  399. #ifdef WIN32
  400. # ifdef _DEBUG
  401. Framework::Logging::warning()
  402. << "recv: " << l << " Error: " << WSAGetLastError();
  403. # endif
  404. #endif
  405. return 0; // Fehler
  406. }
  407. return 1;
  408. }
  409. // Inhalt der SSLServer Klasse
  410. // Konstruktor
  411. SSLServer::SSLServer()
  412. : ReferenceCounter()
  413. {
  414. s = 0;
  415. const SSL_METHOD* method = TLS_server_method();
  416. ctx = SSL_CTX_new(method);
  417. SSLErrorCheck(SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION),
  418. "SSL_CTX_set_min_proto_version");
  419. SSLErrorCheck(SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION),
  420. "SSL_CTX_set_max_proto_version");
  421. SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0);
  422. SSL_CTX_set_default_passwd_cb(ctx, pem_passwd_cb);
  423. passw = new Text();
  424. SSL_CTX_set_default_passwd_cb_userdata(ctx, passw);
  425. addr.sin_family = AF_INET;
  426. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  427. klients = 0;
  428. }
  429. // Destruktor
  430. SSLServer::~SSLServer()
  431. {
  432. trenne();
  433. SSL_CTX_free(ctx);
  434. passw->release();
  435. #ifdef WIN32
  436. OPENSSL_thread_stop();
  437. #endif
  438. }
  439. // nicht constant
  440. // Setzt den Pfad zur Datei, in dem das Certifikat gespeichert ist
  441. bool SSLServer::setCertificateFile(const char* file)
  442. {
  443. return SSLErrorCheck(
  444. SSL_CTX_use_certificate_file(ctx, file, SSL_FILETYPE_PEM),
  445. "SSL_CTX_use_certificate_file");
  446. }
  447. // Setzt den Pfad zur Datei, in dem der private Schlüssel gespeichert ist
  448. bool SSLServer::setPrivateKeyFile(const char* file)
  449. {
  450. return SSLErrorCheck(
  451. SSL_CTX_use_PrivateKey_file(ctx, file, SSL_FILETYPE_PEM),
  452. "SSL_CTX_use_PrivateKey_file");
  453. }
  454. // setzt das passwort des private keys (muss vor setPrivateKeyFile aufgerufen
  455. // werden)
  456. void SSLServer::setPrivateKeyPassword(const char* password)
  457. {
  458. passw->setText(password);
  459. }
  460. // Öffnet das Socket
  461. bool SSLServer::verbinde(unsigned short port, int warteschlangenLen)
  462. {
  463. addr.sin_port = htons(port);
  464. s = socket(AF_INET, SOCK_STREAM, 0);
  465. if (s < 0)
  466. {
  467. s = 0;
  468. return 0;
  469. }
  470. #ifdef WIN32
  471. char reuseSocket = 1;
  472. setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseSocket, sizeof(char));
  473. #else
  474. int reuseSocket = 1;
  475. setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseSocket, sizeof(int));
  476. #endif
  477. if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0)
  478. {
  479. trenne();
  480. return 0;
  481. }
  482. if (listen(s, warteschlangenLen) < 0)
  483. {
  484. trenne();
  485. return 0;
  486. }
  487. return 1;
  488. }
  489. // nimmt Klient an
  490. SSLSKlient* SSLServer::getKlient()
  491. {
  492. if (!s) return 0;
  493. int len = sizeof(addr);
  494. struct sockaddr_in addr;
  495. fd_set set;
  496. int rv = 0;
  497. struct timeval timeout;
  498. while (rv == 0 && s)
  499. {
  500. FD_ZERO(&set); /* clear the set */
  501. FD_SET(s, &set); /* add our file descriptor to the set */
  502. timeout.tv_sec = 10;
  503. timeout.tv_usec = 0;
  504. rv = select((int)s + 1, &set, NULL, NULL, &timeout);
  505. if (rv == -1) return 0;
  506. }
  507. if (!s) return 0;
  508. #ifdef WIN32
  509. SOCKET client = accept(s, (struct sockaddr*)&addr, &len);
  510. if (client == INVALID_SOCKET)
  511. {
  512. trenne();
  513. return 0;
  514. }
  515. #else
  516. SOCKET client
  517. = accept(s, (sockaddr*)&addr, (socklen_t*)&len); // Klient empfangen
  518. if (!client)
  519. {
  520. if (errno == ECONNABORTED || errno == EBADF) trenne();
  521. return 0;
  522. }
  523. #endif
  524. addr.sin_port = this->addr.sin_port;
  525. SSL* ssl = SSL_new(ctx);
  526. if (ssl == 0 && !SSLErrorCheck(0, "SSL_new"))
  527. {
  528. closesocket(client);
  529. return 0;
  530. }
  531. if (!SSLErrorCheck(SSL_set_fd(ssl, (int)client), ssl, "SSL_set_fd"))
  532. {
  533. SSL_free(ssl);
  534. closesocket(client);
  535. return 0;
  536. }
  537. if (!SSLErrorCheck(SSL_accept(ssl), ssl, "SSL_accept"))
  538. {
  539. SSL_free(ssl);
  540. closesocket(client);
  541. return 0;
  542. }
  543. klients++;
  544. return new SSLSKlient(addr, ssl, client);
  545. }
  546. // gibt die Anzahl der Klients zurück
  547. int SSLServer::getKlients(bool reset)
  548. {
  549. int ret = klients;
  550. if (reset) klients = 0;
  551. return ret;
  552. }
  553. // beendet den Server
  554. bool SSLServer::trenne()
  555. {
  556. if (!s) return 1;
  557. if (closesocket(s) < 0) // socket schließen
  558. return 0;
  559. s = 0;
  560. return 1;
  561. }
  562. // constant
  563. // gibt den Port zurück
  564. unsigned short SSLServer::getPort() const
  565. {
  566. return htons(addr.sin_port);
  567. }
  568. // giebt 1 zurück, falls der Server verbunden ist
  569. bool SSLServer::isConnected() const
  570. {
  571. return s != 0;
  572. }
  573. // Inhalt der SSLSKlient Klasse
  574. // Konstruktor
  575. SSLSKlient::SSLSKlient(sockaddr_in client, SSL* ssl, SOCKET s)
  576. : ReferenceCounter()
  577. {
  578. this->s = s;
  579. clientAddr = client;
  580. this->ssl = ssl;
  581. downStreamBytes = 0;
  582. upStreamBytes = 0;
  583. }
  584. // Destruktor
  585. SSLSKlient::~SSLSKlient()
  586. {
  587. trenne();
  588. #ifdef WIN32
  589. OPENSSL_thread_stop();
  590. #endif
  591. }
  592. // nicht constant
  593. void SSLSKlient::setEmpfangTimeout(
  594. int miliseconds) // Setzt ein timeout fürs empfangen von daten
  595. {
  596. #ifdef WIN32
  597. DWORD timeout = miliseconds;
  598. setsockopt(
  599. s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
  600. #else
  601. struct timeval tv;
  602. tv.tv_sec = miliseconds / 1000;
  603. tv.tv_usec = (miliseconds % 1000) * 1000;
  604. setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
  605. #endif
  606. }
  607. bool SSLSKlient::sende(const char* nachricht, int len) // sendet zum Klient
  608. {
  609. if (!ssl) return 0;
  610. int ll = 0;
  611. while (len > 0)
  612. {
  613. int l = SSL_write(ssl, nachricht + ll, len);
  614. if (l <= 0)
  615. {
  616. #ifdef _DEBUG
  617. Framework::Logging::warning()
  618. << "SSL_write: " << l << " Error: " << SSL_get_error(ssl, l);
  619. #endif
  620. return 0; // Fehler
  621. }
  622. len -= l;
  623. ll += l;
  624. }
  625. upStreamBytes += ll;
  626. return 1;
  627. }
  628. bool SSLSKlient::getNachricht(
  629. char* nachricht, int len) // empfängt Nachricht von Klient
  630. {
  631. if (!ssl) return 0;
  632. int ll = 0;
  633. while (len > 0)
  634. {
  635. int l = (int)SSL_read(ssl, nachricht + ll, len);
  636. if (l <= 0)
  637. {
  638. #ifdef _DEBUG
  639. Framework::Logging::warning()
  640. << "SSL_read: " << l << " Error: " << SSL_get_error(ssl, l);
  641. #endif
  642. return 0; // Fehler
  643. }
  644. len -= l;
  645. ll += l;
  646. }
  647. downStreamBytes += ll;
  648. return 1;
  649. }
  650. int SSLSKlient::getDownloadBytes(
  651. bool reset) // gibt die anzahl von empfangen bytes zurück
  652. {
  653. int ret = downStreamBytes;
  654. if (reset) downStreamBytes = 0;
  655. return ret;
  656. }
  657. int SSLSKlient::getUploadBytes(
  658. bool reset) // gibt die anzahl von versendeter bytes zurück
  659. {
  660. int ret = upStreamBytes;
  661. if (reset) upStreamBytes = 0;
  662. return ret;
  663. }
  664. bool SSLSKlient::trenne() // trennt die Verbindung zum Klient
  665. {
  666. if (!ssl) return 0;
  667. SSL_free(ssl);
  668. if (closesocket(s) < 0) // trennen
  669. return 0;
  670. ssl = 0;
  671. s = 0;
  672. return 1;
  673. }
  674. // constant
  675. bool SSLSKlient::hatNachricht(
  676. int zeit) const // Wartet eine Zeit Lang auf eine Nachricht
  677. {
  678. fd_set set;
  679. FD_ZERO(&set);
  680. FD_SET(SSL_get_rfd(ssl), &set);
  681. timeval time = {zeit / 1000, zeit};
  682. return SSL_pending(ssl) > 0 || select(0, &set, 0, 0, &time) == 1;
  683. }
  684. unsigned short SSLSKlient::getPort() const // gibt den Port zurück
  685. {
  686. return htons(clientAddr.sin_port);
  687. }
  688. const char* SSLSKlient::getIp() const // gibt die Ip des Klients zurück
  689. {
  690. return inet_ntoa(clientAddr.sin_addr);
  691. }