Advertisement
loakar

Server Udp na 5

Nov 23rd, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.57 KB | None | 0 0
  1.  
  2. // UDPServer.cpp : Defines the entry point for the console application.
  3. //
  4.  
  5. #include "stdafx.h"
  6. #include <iostream>
  7. #include <stdlib.h>
  8. #include <winsock.h>
  9. #include <bitset>
  10. #include <limits.h>
  11. #include <vector>
  12. #include <algorithm>
  13. #include <math.h>
  14. #include <queue>
  15. #include <thread>
  16. #include <list>
  17. #pragma comment(lib, "Ws2_32.lib")
  18.  
  19. #define SERVERPORT 4950
  20. #define CLIENTPORT 4951
  21.  
  22. class Packet {
  23. int operation; //bity 0-1
  24. int number1; //bity 2-64
  25. int number2; //bity 2-64
  26. int number3; //bity 2-64
  27. int status; //bity 65-69
  28. int id; //bity 70-73
  29. int sizeNumber1; //bity 74-78
  30. int sizeNumber2; //bity 79-83
  31. int sizeNumber3; //bity 84-88
  32. std::bitset<89> binaryData;
  33.  
  34. unsigned char packet[12];
  35. public:
  36. Packet() {
  37. operation = 0;
  38. number1 = 0;
  39. number2 = 0;
  40. number3 = 0;
  41. status = 0;
  42. id = 0;
  43. sizeNumber1 = 0;
  44. sizeNumber2 = 0;
  45. sizeNumber3 = 0;
  46. }
  47.  
  48. private:
  49. //obliczanie wielkosci liczby w bitach
  50. int bitSize(int number) {
  51. int size = 0;
  52. while (number >= 1) {
  53. ++size;
  54. number /= 2;
  55. }
  56. return size;
  57. }
  58.  
  59. //zamiana liczb na postac binarna i wstawienie ich do bitset
  60. void setBits(int number, int startingBit, int size) {
  61. std::vector<int> binary;
  62. while (number >= 1) {
  63. binary.push_back(number % 2);
  64. number /= 2;
  65. }
  66. while (binary.size() < size)binary.push_back(0); //dodaj przednie 0
  67.  
  68. std::reverse(binary.begin(), binary.end());
  69.  
  70. for (int i = 0; i < binary.size(); i++) {
  71. binaryData[startingBit + i] = binary[i];
  72. if (startingBit == binaryData.size() - 1)break; //jezeli to ostatni bit pakietu, przerwij petle
  73. }
  74. }
  75.  
  76. //zamiana z postaci binarnej na dziesietna
  77. void decodeBits(int &number, int startingBit, int size) {
  78. int power = size - 1;
  79. int currentBit = startingBit;
  80. number = 0;
  81.  
  82. for (int i = 0; i < size; i++) {
  83. if (binaryData[currentBit] == 1)
  84. number += pow(2, power - i);
  85. currentBit++;
  86. }
  87. }
  88.  
  89. //tworzenie pakietu do wyslania
  90. void packThePacket() {
  91. for (int i = 0; i < 12; i++)packet[i] = 0;
  92. int currentPart = 0, bitValue = 0, bitCounter = 0, power = 7;
  93. for (int i = 0; i < binaryData.size(); i++) {
  94. bitValue = binaryData[i];
  95. if (bitValue == 1)packet[currentPart] += pow(2, power);
  96. power--;
  97. bitCounter++;
  98. if (bitCounter == 8) {
  99. bitCounter = 0;
  100. currentPart++;
  101. power = 7;
  102. }
  103. }
  104.  
  105. }
  106.  
  107. void unpackThePacket() {
  108. for (int i = 0; i < 12; i++) setBits(packet[i], i * 8, 8);
  109. }
  110.  
  111. public:
  112.  
  113. //tworzenie pakietu, zamiana z postaci dziesietnej na postac binarna wartosci pakietu oraz pakowanie do wyslania
  114. void createPacket() {
  115. setBits(operation, 0, 2); //bity 0-1
  116. setBits(number1, 2, sizeNumber1); //bity 2-65
  117. setBits(number2, 2 + sizeNumber1, sizeNumber2); //bity 2-65
  118. setBits(number3, 2 + sizeNumber1 + sizeNumber2, sizeNumber3); //bity 2-65
  119. setBits(status, 66, 4); //bity 66-69
  120. setBits(id, 70, 4); //bity 70-73
  121. setBits(sizeNumber1, 74, 5); //bity 74-78
  122. setBits(sizeNumber2, 79, 5); //bity 79-83
  123. setBits(sizeNumber3, 84, 5); //bity 84-88
  124. packThePacket();
  125. }
  126.  
  127. void decodePacket(unsigned char* packet) {
  128.  
  129. setPacket(packet); //wczytanie przeslanego pakietu
  130. unpackThePacket(); //rozpakowanie pakietu do postaci binarnej
  131.  
  132. //zamiana wartosci binarnej na wartosci dziesietne
  133. decodeBits(operation, 0, 2); //bity 0-1
  134. decodeBits(sizeNumber1, 74, 5); //bity 74-78
  135. decodeBits(sizeNumber2, 79, 5); //bity 79-83
  136. decodeBits(sizeNumber3, 84, 5); //bity 84-88
  137. decodeBits(number1, 2, sizeNumber1); //bity 2-65
  138. decodeBits(number2, 2 + sizeNumber1, sizeNumber2); //bity 2-65
  139. decodeBits(number3, 2 + sizeNumber1 + sizeNumber2, sizeNumber3); //bity 2-65
  140. decodeBits(status, 66, 4); //bity 65-69
  141. decodeBits(id, 70, 4); //bity 70-73
  142.  
  143. }
  144.  
  145. //zapisanie przyslanego pakietu
  146. void setPacket(unsigned char* packet) {
  147. for (int i = 0; i < 12; i++)this->packet[i] = packet[i];
  148. }
  149. //zwrocenie pakietu do przeslania
  150. void getPacket(unsigned char* packet) {
  151. for (int i = 0; i < 12; i++)packet[i] = this->packet[i];
  152. }
  153.  
  154. int getOperation() {
  155. return this->operation;
  156. }
  157.  
  158. int getStatus() {
  159. return this->status;
  160. }
  161.  
  162. void calculateResult() {
  163. long long int result;
  164. if (operation == 0) { //dodawanie
  165. result = number1 + number2 + number3;
  166. if (result <= INT_MAX)number1 = result;
  167. else status = 10; //przepelnienie zmiennej
  168. }
  169. if (operation == 1) { //mnozenie
  170. result = number1*number2*number3;
  171. if (result <= INT_MAX)number1 = result;
  172. else status = 10; //przepelnienie zmiennej
  173. }
  174. if (operation == 2) { //odejmowanie
  175. result = number1 - number2 - number3;
  176. if (result <= INT_MAX)number1 = result;
  177. else status = 10; //przepelnienie zmiennej
  178. }
  179. if (operation == 3) { //dzielenie
  180. if (number2 != 0 && number3 != 0) {
  181. result = number1 / number2 / number3;
  182. if (result <= INT_MAX)number1 = result;
  183. else status = 10; //przepelnienie zmiennej
  184. }
  185. else {
  186. status = 6; //blad dzielenia przez 0
  187. }
  188. }
  189.  
  190. if (status != 6 && status != 10) {
  191. sizeNumber1 = bitSize(number1);
  192. number2 = 0; //przy zwracaniu wyniku, te wartosci sa nieuzywane
  193. sizeNumber2 = 0; //przy zwracaniu wyniku, te wartosci sa nieuzywane
  194. sizeNumber3 = 0; //przy zwracaniu wyniku, te wartosci sa nieuzywane
  195. number3 = 0; //przy zwracaniu wyniku, te wartosci sa nieuzywane
  196. status = 3; //ustaw stan na zwracanie wyniku;
  197. }
  198. createPacket();
  199. }
  200.  
  201. void setId(int id) {
  202. this->id = id;
  203. this->status = 1; //zwrocenie ID sesji klientowi
  204. createPacket();
  205. }
  206.  
  207. //ustawienie statusu pakietu
  208. bool setStatus(int status) {
  209. this->status = status;
  210. return true;
  211. }
  212.  
  213. int getId() {
  214. return this->id;
  215. }
  216. //zwroc wynik dzialania
  217. int getProduct() {
  218. return this->number1;
  219. }
  220.  
  221. int sumNumbers() {
  222. return number1 + number2 + number3;
  223. }
  224. //ustaw wynik dzialania
  225. void setProduct(int value) {
  226. this->number1 = value;
  227. sizeNumber1 = bitSize(number1);
  228. number2 = 0; //przy zwracaniu wyniku, te wartosci sa nieuzywane
  229. sizeNumber2 = 0; //przy zwracaniu wyniku, te wartosci sa nieuzywane
  230. sizeNumber3 = 0; //przy zwracaniu wyniku, te wartosci sa nieuzywane
  231. number3 = 0; //przy zwracaniu wyniku, te wartosci sa nieuzywane
  232. status = 3; //ustaw stan na zwracanie wyniku;
  233. createPacket();
  234. }
  235.  
  236. void showPacket() {
  237. for (int i = 0; i < binaryData.size(); i++)std::cout << binaryData[i];
  238. std::cout << std::endl;
  239. }
  240.  
  241. void showStructure() {
  242. std::cout << operation << " " << number1 << " " << number2 << " " << number3 << " " << status << " " << id << " " << sizeNumber1 << " " << sizeNumber2 << " " << sizeNumber3 << std::endl;
  243. }
  244.  
  245.  
  246. };
  247.  
  248. struct WaitingPacket {
  249. sockaddr_in client;
  250. unsigned char packet[12];
  251. };
  252.  
  253. class Connection {
  254. sockaddr_in client;
  255. sockaddr_in server;
  256. WSADATA wsaData;
  257. SOCKET mainSocket;
  258.  
  259. Packet packet;
  260. std::queue<WaitingPacket>packetBuffor;
  261. int bytesSent;
  262. int bytesRecv;
  263. unsigned char packetRecived[12];
  264. unsigned char packetSent[12];
  265. int maxUsers;
  266. std::list<int> idList;
  267. int buforWyniku;
  268.  
  269. public:
  270. Connection() {
  271. memset(&server, 0, sizeof(server));
  272. server.sin_family = AF_INET;
  273. server.sin_addr.s_addr = inet_addr("127.0.0.1");
  274. server.sin_port = htons(SERVERPORT);
  275. bytesSent = 0;
  276. bytesRecv = 0;
  277. maxUsers = 3;
  278. buforWyniku = 0;
  279. }
  280.  
  281. bool connect() {
  282. int result = WSAStartup(MAKEWORD(2, 2), &wsaData); //wybor wersji winsock
  283. if (result != NO_ERROR)
  284. std::cout << "Blad inicjalizacji" << std::endl;
  285.  
  286. mainSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //tworzenie socketu UDP
  287. if (mainSocket == INVALID_SOCKET)
  288. {
  289. std::cout << "Blad podczas tworzenia socketu: " << WSAGetLastError() << std::endl;
  290. WSACleanup();
  291. return 0;
  292. }
  293.  
  294. //przypisanie socketu do adresu
  295. if (bind(mainSocket, (SOCKADDR *)& server, sizeof(client)) == SOCKET_ERROR)
  296. {
  297. std::cout << "bind() zakonczony niepoowdzeniem " << std::endl;
  298. closesocket(mainSocket);
  299. return 0;
  300. }
  301.  
  302. }
  303. //sprawdzanie czy ID istnieje na serwerze
  304. bool checkId(int id) {
  305. std::list<int>::iterator iter = std::find(idList.begin(), idList.end(), id);
  306. if (iter != idList.end())return true; //znaleziono id
  307. else return false; //nie znaleziono id
  308. }
  309.  
  310. int giveId() {
  311. //szukanie wolnego id
  312. for (int i = 1; i <= maxUsers; i++)
  313. if (!checkId(i))return i; //jezeli nie znaleziono to zwroc je
  314.  
  315. return 0; //jezeli wszystkie id sa zajete zwroc 0
  316. }
  317.  
  318. void deleteId(int id) {
  319. idList.remove(id);
  320. }
  321. //odbior danych
  322. void reciveData() {
  323. int addr_len = sizeof(struct sockaddr);
  324. WaitingPacket toQueue;
  325.  
  326. while (true) {
  327. bytesRecv = recvfrom(mainSocket, (char*)toQueue.packet, sizeof(toQueue.packet), 0,
  328. (struct sockaddr *) &toQueue.client, &addr_len);
  329.  
  330. packetBuffor.push(toQueue);
  331. }
  332. }
  333. //przeslanie danych
  334. void sendData() {
  335. WaitingPacket fromBuffor;
  336.  
  337. while (true) {
  338. if (packetBuffor.size() > 0) {
  339.  
  340. fromBuffor = packetBuffor.front();
  341. packetBuffor.pop();
  342.  
  343. packet.decodePacket(fromBuffor.packet);
  344. int status = packet.getStatus();
  345.  
  346. //sprawdzenie poprawnosci id
  347. if (!checkId(packet.getId()) && status!=0) {
  348. status = 7; //blad id
  349. }
  350.  
  351.  
  352. std::cout << "Uzytkownik [" << packet.getId() << "] : ";
  353.  
  354. switch (status) {
  355. case 0: //prosba o id
  356. if (idList.size() < maxUsers) {
  357. int id = giveId();
  358. packet.setId(id); //nadaj id ktorego nie ma jeszcze na liscie
  359. idList.push_back(id);
  360. std::cout << "Wysylam ID: " << packet.getId() << " klientowi!" << std::endl;
  361. }
  362. else {
  363. std::cout << "Przekroczono maksymalna ilosc uzytkownikow" << std::endl;
  364. packet.setStatus(8);
  365. packet.createPacket();
  366. }
  367. break;
  368. case 2: //wybranie operacji arytmetycznej
  369. packet.calculateResult();
  370. std::cout << "Wynik dzialania to: " << packet.getProduct() << std::endl;
  371. break;
  372. case 4: //odbieranie wielu liczb do sumowania
  373. buforWyniku += packet.sumNumbers(); //zapisz wynik do bufora
  374. std::cout << "Aktualny wynik sumowania to: " << buforWyniku << std::endl;
  375. break;
  376. case 5: //ostatnie liczby do dodania
  377. buforWyniku += packet.sumNumbers();
  378. packet.setProduct(buforWyniku);
  379. std::cout << "Ostateczny wynik sumowania to: " << packet.getProduct() << std::endl;
  380. buforWyniku = 0;
  381. break;
  382. case 7: //blad ID
  383. std::cout << "Nieznane id" << std::endl;
  384. packet.setStatus(7);
  385. packet.createPacket();
  386. break;
  387. case 9: //Klient zakonczyl polaczenie
  388. std::cout << "Zakonczenie polaczenia" << std::endl;
  389. deleteId(packet.getId());
  390. break;
  391. default: //nieokreslone
  392. std::cout << "Niekreslone" << std::endl;
  393. break;
  394. }
  395.  
  396. //jezeli nie czeka na kolejne liczby lub klient sie nie rozlaczyl, przeslij pakiet
  397. if (packet.getStatus() != 4 && packet.getStatus() != 9) {
  398. packet.getPacket(packetSent);
  399.  
  400. bytesSent = sendto(mainSocket, (char*)packetSent, sizeof(packetSent), 0,
  401. (struct sockaddr *) & fromBuffor.client, sizeof(struct sockaddr));
  402. }
  403. }
  404. }
  405. }
  406.  
  407. std::thread reciveThread() {
  408. return std::thread([this] { reciveData(); });
  409. }
  410.  
  411. std::thread sendThread() {
  412. return std::thread([this] { sendData(); });
  413. }
  414.  
  415. };
  416.  
  417. int main(int argc, char * argv[])
  418. {
  419. Connection connection;
  420.  
  421. connection.connect();
  422.  
  423. std::thread t1 = connection.reciveThread();
  424. std::thread t2 = connection.sendThread();
  425. t1.join();
  426. t2.join();
  427.  
  428. system("PAUSE");
  429.  
  430. return 0;
  431.  
  432. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement