Server.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #include "Server.h"
  2. #ifndef WIN32
  3. #include <string.h>
  4. #endif
  5. #include <Key.h>
  6. using namespace Network;
  7. // Inhalt der Server Klasse aus Server.h
  8. // Konstruktor
  9. Server::Server()
  10. {
  11. sock = 0;
  12. memset( &addresse, 0, sizeof( addresse ) ); // Adresse setzen
  13. addresse.sin_family = AF_INET;
  14. addresse.sin_addr.s_addr = ADDR_ANY;
  15. ref = 1;
  16. klients = 0;
  17. }
  18. // Destruktor
  19. Server::~Server()
  20. {
  21. }
  22. // nicht constant
  23. bool Server::verbinde( unsigned short port, int warteschlangenLen ) // Öffnet das Socket
  24. {
  25. sock = socket( AF_INET, SOCK_STREAM, 0 ); // Socket erstellen
  26. addresse.sin_port = htons( port ); // port setzen
  27. if( bind( sock, ( struct sockaddr* )&addresse, sizeof( addresse ) ) == -1 ) // socket öffnen
  28. return 0; // Fehler
  29. if( listen( sock, warteschlangenLen ) == -1 ) // Klients annehmen
  30. return 0; // Fehler
  31. return 1;
  32. }
  33. SKlient *Server::getKlient() // nimmt Klient an
  34. {
  35. if( !sock )
  36. return 0;
  37. sockaddr_in client;
  38. int len = sizeof( addresse );
  39. #ifdef WIN32
  40. SOCKET cls = accept( sock, (sockaddr*)&client, &len ); // Klient empfangen
  41. if( cls == INVALID_SOCKET )
  42. return 0;
  43. #else
  44. SOCKET cls = accept( sock, (sockaddr*)&client, (socklen_t*)&len ); // Klient empfangen
  45. if( !cls )
  46. return 0;
  47. #endif
  48. client.sin_port = addresse.sin_port;
  49. klients++;
  50. return new SKlient( client, cls ); // Klient Handle Klasse zurückgeben
  51. }
  52. int Server::getKlients( bool reset ) // gibt die Anzahl der Klients zurück
  53. {
  54. int ret = klients;
  55. if( reset )
  56. klients = 0;
  57. return ret;
  58. }
  59. bool Server::trenne() // beendet den Server
  60. {
  61. if( !sock )
  62. return 1;
  63. if( closesocket( sock ) < 0 ) // socket schließen
  64. return 0;
  65. sock = 0;
  66. return 1;
  67. }
  68. // constant
  69. unsigned short Server::getPort() const // gibt den Port zurück
  70. {
  71. return htons( addresse.sin_port );
  72. }
  73. // Reference Counting
  74. Server *Server::getThis()
  75. {
  76. ref++;
  77. return this;
  78. }
  79. Server *Server::release()
  80. {
  81. ref--;
  82. if( !ref )
  83. delete this;
  84. return 0;
  85. }
  86. // Inhalt der SKlient Klasse aus Server.h
  87. // Konstruktor
  88. SKlient::SKlient( sockaddr_in addresse, SOCKET sock )
  89. {
  90. clientAddr = addresse;
  91. this->sock = sock;
  92. ref = 1;
  93. downStreamBytes = 0;
  94. upStreamBytes = 0;
  95. sendeKey = 0;
  96. empfangKey = 0;
  97. }
  98. // Destruktor
  99. SKlient::~SKlient()
  100. {
  101. trenne();
  102. if( sendeKey )
  103. sendeKey->release();
  104. if( empfangKey )
  105. empfangKey->release();
  106. }
  107. // nicht constant
  108. void SKlient::setSendeKeyZ( Encryption::Key *key ) // Setzt den Key fürs Senden
  109. {
  110. if( sendeKey )
  111. sendeKey->release();
  112. sendeKey = key;
  113. }
  114. void SKlient::setEmpfangKeyZ( Encryption::Key *key ) // Setzt den Key fürs Empfangen
  115. {
  116. if( empfangKey )
  117. empfangKey->release();
  118. empfangKey = key;
  119. }
  120. void SKlient::setSendeKey( char *key, int len ) // Setzt den Key fürs Senden
  121. {
  122. if( !sendeKey )
  123. sendeKey = new Encryption::Key();
  124. sendeKey->setKey( key, len );
  125. }
  126. void SKlient::setEmpfangKey( char *key, int len ) // Setzt den Key fürs Empfangen
  127. {
  128. if( !empfangKey )
  129. empfangKey = new Encryption::Key();
  130. empfangKey->setKey( key, len );
  131. }
  132. bool SKlient::sende( const char *nachricht, int len ) // sendet zum Klient
  133. {
  134. if( !sock )
  135. return 0;
  136. int ll = 0;
  137. while( len > 0 )
  138. {
  139. #ifdef WIN32
  140. int l = send( sock, nachricht + ll, len, 0 );
  141. #else
  142. int l = (int)send( sock, nachricht + ll, len, MSG_NOSIGNAL );
  143. #endif
  144. if( l < 0 )
  145. return 0; // Fehler
  146. len -= l;
  147. ll += l;
  148. }
  149. upStreamBytes += ll;
  150. return 1;
  151. }
  152. bool SKlient::getNachricht( char *nachricht, int len ) // empfängt Nachricht von Klient
  153. {
  154. if( !sock )
  155. return 0;
  156. int ll = 0;
  157. while( len > 0 )
  158. {
  159. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  160. if( l < 0 )
  161. return 0; // Fehler
  162. len -= l;
  163. ll += l;
  164. }
  165. downStreamBytes += ll;
  166. return 1;
  167. }
  168. bool SKlient::sendeEncrypted( const char *nachricht, int len ) // sendet zum Server
  169. {
  170. if( !sendeKey )
  171. return sende( nachricht, len );
  172. Encryption::Bytes *n = new Encryption::Bytes( nachricht, len );
  173. sendeKey->codieren( n->getThis() ); int ll = 0;
  174. while( len > 0 )
  175. {
  176. #ifdef WIN32
  177. int l = send( sock, n->getBytes() + ll, len, 0 );
  178. #else
  179. int l = (int)send( sock, n->getBytes() + ll, len, MSG_NOSIGNAL );
  180. #endif
  181. if( l < 0 )
  182. {
  183. n->release();
  184. return 0; // Fehler
  185. }
  186. len -= l;
  187. ll += l;
  188. }
  189. upStreamBytes += ll;
  190. n->release();
  191. return 1;
  192. }
  193. bool SKlient::getNachrichtEncrypted( char *nachricht, int len ) // empfängt Nachricht
  194. {
  195. if( !empfangKey )
  196. return getNachricht( nachricht, len );
  197. int ll = 0;
  198. while( len > 0 )
  199. {
  200. int l = (int)recv( sock, nachricht + ll, len, MSG_WAITALL );
  201. if( l < 0 )
  202. return 0; // Fehler
  203. len -= l;
  204. ll += l;
  205. }
  206. Encryption::Bytes *n = new Encryption::Bytes();
  207. n->setBytesZ( nachricht, ll );
  208. empfangKey->decodieren( n );
  209. downStreamBytes += ll;
  210. return 1;
  211. }
  212. int SKlient::getDownloadBytes( bool reset ) // gibt die anzahl von empfangen bytes zurück
  213. {
  214. int ret = downStreamBytes;
  215. if( reset )
  216. downStreamBytes = 0;
  217. return ret;
  218. }
  219. int SKlient::getUploadBytes( bool reset ) // gibt die anzahl von versendeter bytes zurück
  220. {
  221. int ret = upStreamBytes;
  222. if( reset )
  223. upStreamBytes = 0;
  224. return ret;
  225. }
  226. bool SKlient::trenne() // trennt die Verbindung zum Klient
  227. {
  228. if( !sock )
  229. return 0;
  230. if( closesocket( sock ) < 0 ) // trennen
  231. return 0;
  232. sock = 0;
  233. return 1;
  234. }
  235. // constant
  236. unsigned short SKlient::getPort() const // gibt den Port zurück
  237. {
  238. return htons( clientAddr.sin_port );
  239. }
  240. const char *SKlient::getIp() const // gibt die Ip des Klients zurück
  241. {
  242. return inet_ntoa( clientAddr.sin_addr );
  243. }
  244. // Reference Counting
  245. SKlient *SKlient::getThis()
  246. {
  247. ref++;
  248. return this;
  249. }
  250. SKlient *SKlient::release()
  251. {
  252. ref--;
  253. if( !ref )
  254. delete this;
  255. return 0;
  256. }