Klient.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. #include <openssl/bio.h>
  2. #include <openssl/ssl.h>
  3. #include "Klient.h"
  4. #ifndef WIN32
  5. #include <string.h>
  6. #endif
  7. #include <Key.h>
  8. #include <Datei.h>
  9. using namespace Network;
  10. // inhalt der Klient Klasse aus Klient.h
  11. // Konstruktor
  12. Klient::Klient()
  13. {
  14. memset( &server, 0, sizeof( server ) );
  15. server.sin_family = AF_INET;
  16. ref = 1;
  17. downStreamBytes = 0;
  18. upStreamBytes = 0;
  19. sock = 0;
  20. sendeKey = 0;
  21. empfangKey = 0;
  22. }
  23. // Destruktoe
  24. Klient::~Klient()
  25. {
  26. if( sock )
  27. trenne();
  28. if( sendeKey )
  29. sendeKey->release();
  30. if( empfangKey )
  31. empfangKey->release();
  32. }
  33. // nicht constant
  34. void Klient::setSendeKeyZ( Encryption::Key *key ) // Setzt den Key fürs Senden
  35. {
  36. if( sendeKey )
  37. sendeKey->release();
  38. sendeKey = key;
  39. }
  40. void Klient::setEmpfangKeyZ( Encryption::Key *key ) // Setzt den Key fürs Empfangen
  41. {
  42. if( empfangKey )
  43. empfangKey->release();
  44. empfangKey = key;
  45. }
  46. void Klient::setSendeKey( char *key, int len ) // Setzt den Key fürs Senden
  47. {
  48. if( !sendeKey )
  49. sendeKey = new Encryption::Key();
  50. sendeKey->setKey( key, len );
  51. }
  52. void Klient::setEmpfangKey( char *key, int len ) // Setzt den Key fürs Empfangen
  53. {
  54. if( !empfangKey )
  55. empfangKey = new Encryption::Key();
  56. empfangKey->setKey( key, len );
  57. }
  58. bool Klient::verbinde( unsigned short port, const char *ip ) // verbindet mit Server
  59. {
  60. if( sendeKey )
  61. sendeKey->setPos( 0 );
  62. if( empfangKey )
  63. empfangKey->setPos( 0 );
  64. if( sock )
  65. closesocket( sock );
  66. sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
  67. long sIp = inet_addr( ip ); // ip addresse
  68. memcpy( (char*)&server.sin_addr, &sIp, sizeof( sIp ) );
  69. server.sin_port = htons( port ); // port
  70. if( connect( sock, ( struct sockaddr* )&server, sizeof( server ) ) < 0 ) // verbinden
  71. return 0; // Fehler
  72. return 1;
  73. }
  74. bool Klient::sende( const char *nachricht, int len ) // sendet zum Server
  75. {
  76. int ll = 0;
  77. while( len > 0 )
  78. {
  79. #ifdef WIN32
  80. int l = send( sock, nachricht + ll, len, 0 );
  81. #else
  82. int l = (int)send( sock, nachricht + ll, len, MSG_NOSIGNAL );
  83. #endif
  84. if( l <= 0 )
  85. return 0; // Fehler
  86. len -= l;
  87. ll += l;
  88. }
  89. upStreamBytes += ll;
  90. return 1;
  91. }
  92. bool Klient::getNachricht( char *nachricht, int len ) // empfängt Nachricht
  93. {
  94. int ll = 0;
  95. while( len > 0 )
  96. {
  97. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  98. if( l <= 0 )
  99. return 0; // Fehler
  100. len -= l;
  101. ll += l;
  102. }
  103. downStreamBytes += ll;
  104. return 1;
  105. }
  106. bool Klient::sendeEncrypted( const char *nachricht, int len ) // sendet zum Server
  107. {
  108. if( !sendeKey )
  109. return sende( nachricht, len );
  110. Encryption::Bytes *n = new Encryption::Bytes( nachricht, len );
  111. sendeKey->codieren( n->getThis() );
  112. int ll = 0;
  113. while( len > 0 )
  114. {
  115. #ifdef WIN32
  116. int l = send( sock, n->getBytes() + ll, len, 0 );
  117. #else
  118. int l = (int)send( sock, n->getBytes() + ll, len, MSG_NOSIGNAL );
  119. #endif
  120. if( l <= 0 )
  121. {
  122. n->release();
  123. return 0; // Fehler
  124. }
  125. len -= l;
  126. ll += l;
  127. }
  128. upStreamBytes += ll;
  129. n->release();
  130. return 1;
  131. }
  132. bool Klient::getNachrichtEncrypted( char *nachricht, int len ) // empfängt Nachricht
  133. {
  134. if( !empfangKey )
  135. return getNachricht( nachricht, len );
  136. int ll = 0;
  137. while( len > 0 )
  138. {
  139. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  140. if( l <= 0 )
  141. return 0; // Fehler
  142. len -= l;
  143. ll += l;
  144. }
  145. Encryption::Bytes *n = new Encryption::Bytes();
  146. n->setBytesZ( nachricht, ll );
  147. empfangKey->decodieren( n );
  148. downStreamBytes += ll;
  149. return 1;
  150. }
  151. int Klient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  152. {
  153. int ret = downStreamBytes;
  154. if( reset )
  155. downStreamBytes = 0;
  156. return ret;
  157. }
  158. int Klient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  159. {
  160. int ret = upStreamBytes;
  161. if( reset )
  162. upStreamBytes = 0;
  163. return ret;
  164. }
  165. bool Klient::trenne() // Trennt die Verbindung zum Server
  166. {
  167. if( !sock )
  168. return 1;
  169. if( sendeKey )
  170. sendeKey->setPos( 0 );
  171. if( empfangKey )
  172. empfangKey->setPos( 0 );
  173. if( closesocket( sock ) < 0 ) // verbindung Trennen
  174. return 0; // Fehler
  175. sock = 0;
  176. return 1;
  177. }
  178. // constant
  179. bool Klient::hatNachricht( int zeit ) // Wartet eine Zeit Lang auf eine Nachricht
  180. {
  181. #ifdef WIN32
  182. fd_set set = { 1, { sock } };
  183. timeval time = { zeit / 1000, zeit };
  184. return select( 0, &set, 0, 0, &time ) == 1;
  185. #else
  186. return 1;
  187. #endif
  188. }
  189. unsigned short Klient::getServerPort() const // gibt den Port zurück
  190. {
  191. return htons( server.sin_port );
  192. }
  193. const char *Klient::getServerIp() const // gibt die Ip zurück
  194. {
  195. return inet_ntoa( server.sin_addr );
  196. }
  197. // Reference Counting
  198. Klient *Klient::getThis()
  199. {
  200. ref++;
  201. return this;
  202. }
  203. Klient *Klient::release()
  204. {
  205. ref--;
  206. if( !ref )
  207. delete this;
  208. return 0;
  209. }
  210. // Inhalt der SSLKlient Klasse aus Klient.h
  211. // Konstruktor
  212. SSLKlient::SSLKlient()
  213. {
  214. ctx = SSL_CTX_new( SSLv23_client_method() );
  215. ip = 0;
  216. port = 0;
  217. bio = BIO_new_ssl_connect( ctx );
  218. BIO_get_ssl( bio, &ssl );
  219. downStreamBytes = 0;
  220. upStreamBytes = 0;
  221. connected = 0;
  222. ref = 1;
  223. }
  224. // Destruktor
  225. SSLKlient::~SSLKlient()
  226. {
  227. if( this->ip )
  228. this->ip->release();
  229. if( connected )
  230. trenne();
  231. BIO_free_all( bio );
  232. SSL_CTX_free( ctx );
  233. #ifdef WIN32
  234. OPENSSL_thread_stop();
  235. #endif
  236. }
  237. bool SSLKlient::verbinde( unsigned short port, const char *ip ) // verbindet mit Server
  238. {
  239. this->port = port;
  240. if( this->ip )
  241. this->ip->release();
  242. this->ip = new Text( ip );
  243. Text adr = ip;
  244. adr += ":";
  245. adr += port;
  246. BIO_set_conn_hostname( bio, adr );
  247. connected = BIO_do_connect( bio ) > 0;
  248. if( connected && BIO_do_handshake( bio ) <= 0 )
  249. trenne();
  250. return connected;
  251. }
  252. bool SSLKlient::sende( const char *nachricht, int len ) // sendet zum Server
  253. {
  254. int ll = 0;
  255. while( len > 0 )
  256. {
  257. int l = SSL_write( ssl, nachricht + ll, len );
  258. if( l <= 0 )
  259. return 0; // Fehler
  260. len -= l;
  261. ll += l;
  262. }
  263. upStreamBytes += ll;
  264. return 1;
  265. }
  266. bool SSLKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht
  267. {
  268. if( !connected )
  269. return 0;
  270. int ll = 0;
  271. while( len > 0 )
  272. {
  273. int l = SSL_read( ssl, nachricht + ll, len );
  274. if( l <= 0 )
  275. return 0; // Fehler
  276. len -= l;
  277. ll += l;
  278. }
  279. downStreamBytes += ll;
  280. return 1;
  281. }
  282. int SSLKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  283. {
  284. int ret = downStreamBytes;
  285. if( reset )
  286. downStreamBytes = 0;
  287. return ret;
  288. }
  289. int SSLKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  290. {
  291. int ret = upStreamBytes;
  292. if( reset )
  293. upStreamBytes = 0;
  294. return ret;
  295. }
  296. bool SSLKlient::trenne() // Trennt die Verbindung zum Server
  297. {
  298. BIO_ssl_shutdown( bio );
  299. connected = 0;
  300. return 1;
  301. }
  302. // constant
  303. unsigned short SSLKlient::getServerPort() const // gibt den Port des Servers zurück
  304. {
  305. return port;
  306. }
  307. const char *SSLKlient::getServerIp() const // gibt die Ip des Servers zurück
  308. {
  309. return ip->getText();
  310. }
  311. // Reference Counting
  312. SSLKlient *SSLKlient::getThis()
  313. {
  314. ref++;
  315. return this;
  316. }
  317. SSLKlient *SSLKlient::release()
  318. {
  319. if( !--ref )
  320. delete this;
  321. return 0;
  322. }