Advertisement
loakar

Udp Client Binary

Nov 21st, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.39 KB | None | 0 0
  1. // UDPConnection.cpp : Defines the entry point for the console application.
  2.  
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <stdlib.h>
  7. #include <winsock.h>
  8. #include <bitset>
  9. #include <limits.h>
  10. #include <vector>
  11. #include <algorithm>
  12. #include <time.h>
  13. #include <math.h>
  14. #pragma comment(lib, "Ws2_32.lib")
  15. #define SERVERPORT 4950    
  16.  
  17. /*
  18. operacje
  19. 00 - dodawanie
  20. 01 - mnozenie
  21. 10 - odejmowanie
  22. 11 - dzielenie
  23. status
  24. 0000 - popros ID
  25. 0001 - ID wyslane
  26. 0010 - zadanie obliczenia
  27. 0011 - zwrocenie wyniku obliczenia
  28. 0100 - zadanie sumy wielu liczb lub przeslanie kolejnych liczb do sumowania
  29. 0101 - ostatnie liczby do sumowania
  30. 0110 - blad
  31. 0111-1111 - niezdefiniowane
  32. */
  33.  
  34. class Packet {
  35.     int operation;      //bity 0-1
  36.     int number1;        //bity 2-64
  37.     int number2;        //bity 2-64
  38.     int number3;        //bity 2-64
  39.     int status;         //bity 65-69
  40.     int id;             //bity 70-73
  41.     int sizeNumber1;    //bity 74-78   
  42.     int sizeNumber2;    //bity 79-83
  43.     int sizeNumber3;    //bity 84-88
  44.     std::bitset<89> binaryData; //pakiet zapisany w formacie binarnym
  45.     unsigned char packet[12]; //pakiet w formie do przeslania
  46.  
  47. public:
  48.     Packet() {
  49.         operation = 0;
  50.         number1 = 0;
  51.         number2 = 0;
  52.         number3 = 0;
  53.         status = 0;
  54.         id = 0;
  55.         sizeNumber1 = 0;
  56.         sizeNumber2 = 0;
  57.         sizeNumber3 = 0;
  58.         for (int i = 0; i < 12; i++)packet[i] = 0; //wyzerowanie pakietu
  59.     }
  60.  
  61.  
  62. private:
  63.     //obliczanie wielkosci liczby w bitach
  64.     int bitSize(int number) {
  65.         int size = 0;
  66.         while (number >= 1) {
  67.             ++size;
  68.             number /= 2;
  69.         }
  70.         return size;
  71.     }
  72.     //zamiana liczb na postac binarna i wstawienie ich do bitset
  73.     void setBits(int number, int startingBit, int size) {
  74.         std::vector<int> binary;
  75.         while (number >= 1) {
  76.             binary.push_back(number % 2);
  77.             number /= 2;
  78.         }
  79.  
  80.         while (binary.size() < size)binary.push_back(0); //dodaj przednie 0
  81.  
  82.         std::reverse(binary.begin(), binary.end()); //odwroc bityaby otrzymac poprawna liczbe binarna
  83.  
  84.         for (int i = 0; i < binary.size(); i++) {
  85.             binaryData[startingBit + i] = binary[i];
  86.             if (startingBit == binaryData.size() - 1)break; //jezeli to ostatni bit pakietu, przerwij petle
  87.         }
  88.  
  89.     }
  90.  
  91.     //zamiana z postaci binarnej na dziesietna
  92.     void decodeBits(int &number, int startingBit, int size) {
  93.         int power = size - 1;
  94.         int currentBit = startingBit;
  95.         number = 0;
  96.  
  97.         for (int i = 0; i < size; i++) {
  98.             if (binaryData[currentBit] == 1)
  99.                 number += pow(2, power - i);
  100.             currentBit++;
  101.         }
  102.     }
  103.  
  104.     //zapisanie jednej z 3 liczb do pakietu
  105.     bool chooseNumber(int number, int value) {
  106.         switch (number) {
  107.         case 1:
  108.             if (number <= INT_MAX) {
  109.                 this->number1 = value;
  110.                 this->sizeNumber1 = bitSize(value);
  111.                 return true;
  112.             }
  113.             else return false;
  114.  
  115.             break;
  116.         case 2:
  117.             if (number <= INT_MAX)
  118.             {
  119.                 this->number2 = value;
  120.                 this->sizeNumber2 = bitSize(value);
  121.                 return true;
  122.             }
  123.             else return false;
  124.             break;
  125.         case 3:
  126.             if (number <= INT_MAX && (this->sizeNumber1 + this->sizeNumber2 + bitSize(value)) < 62) {
  127.                 this->number3 = value;
  128.                 this->sizeNumber3 = bitSize(value);
  129.                 return true;
  130.             }
  131.             else return false;
  132.  
  133.             break;
  134.         }
  135.     }
  136.     //tworzenie pakietu do wyslania z reprezentajci binarnej
  137.     void packThePacket() {
  138.         for (int i = 0; i < 12; i++)packet[i] = 0;
  139.         int currentPart = 0, bitValue = 0, bitCounter = 0, power = 7;
  140.         for (int i = 0; i < binaryData.size(); i++) {
  141.             bitValue = binaryData[i];
  142.             if (bitValue == 1)packet[currentPart] += pow(2, power);
  143.             power--;
  144.             bitCounter++;
  145.             if (bitCounter == 8) {
  146.                 bitCounter = 0;
  147.                 currentPart++;
  148.                 power = 7;
  149.             }
  150.         }
  151.     }
  152.  
  153.     void unpackThePacket() {
  154.         for (int i = 0; i < 12; i++) setBits(packet[i], i * 8, 8);
  155.     }
  156.  
  157. public:
  158.     //tworzenie pakietu, zamiana z postaci dziesietnej na postac binarna wartosci pakietu oraz pakowanie do wyslania
  159.     void createPacket() {
  160.         setBits(operation, 0, 2);                                               //bity 0-1
  161.         setBits(number1, 2, sizeNumber1);                                       //bity 2-64
  162.         setBits(number2, 2 + sizeNumber1, sizeNumber2);                         //bity 2-64
  163.         setBits(number3, 2 + sizeNumber1 + sizeNumber2, sizeNumber3);           //bity 2-64
  164.         setBits(status, 65, 4);                                                 //bity 65-69
  165.         setBits(id, 70, 4);                                                     //bity 70-73
  166.         setBits(sizeNumber1, 74, 5);                                                //bity 74-78   
  167.         setBits(sizeNumber2, 79, 5);                                                //bity 79-83
  168.         setBits(sizeNumber3, 84, 5);                                                //bity 84-88
  169.         packThePacket();
  170.     }
  171.  
  172.     void decodePacket(unsigned char* packet) {
  173.  
  174.         setPacket(packet); //wczytanie przeslanego pakietu
  175.         unpackThePacket(); //rozpakowanie pakietu do postaci binarnej
  176.  
  177.         //zamiana wartosci binarnej na wartosci dziesietne
  178.         decodeBits(operation, 0, 2);                                                //bity 0-1
  179.         decodeBits(sizeNumber1, 74, 5);                                             //bity 74-78   
  180.         decodeBits(sizeNumber2, 79, 5);                                             //bity 79-83
  181.         decodeBits(sizeNumber3, 84, 5);                                             //bity 84-88
  182.         decodeBits(number1, 2, sizeNumber1);                                        //bity 2-64
  183.         decodeBits(number2, 2 + sizeNumber1, sizeNumber2);                          //bity 2-64
  184.         decodeBits(number3, 2 + sizeNumber1 + sizeNumber2, sizeNumber3);            //bity 2-64
  185.         decodeBits(status, 65, 4);                                                  //bity 65-69
  186.         decodeBits(id, 70, 4);                                                      //bity 70-73
  187.  
  188.     }
  189.  
  190.     void inputData(int operation) {
  191.         int value;
  192.  
  193.         if (operation <= 4) {
  194.             std::cout << "Podaj 1 liczbe: ";
  195.             do {
  196.                 std::cin >> value;
  197.             } while (!chooseNumber(1, value));
  198.             std::cout << "Podaj 2 liczbe: ";
  199.  
  200.             do {
  201.                 std::cin >> value;
  202.             } while (!chooseNumber(2, value));
  203.  
  204.             std::cout << "Podaj 3 liczbe: ";
  205.             do {
  206.                 std::cin >> value;
  207.             } while (!chooseNumber(3, value));
  208.  
  209.         }
  210.         else {
  211.             std::cout << "Nieoczekiwany blad programu!" << std::endl;
  212.         }
  213.  
  214.         if (operation <= 3) {
  215.             this->operation = operation; //operacja jaka serwer ma wykoac z liczbami
  216.             status = 2; //wyslanie danych do obliczenia przez serwer
  217.         }
  218.         else if (operation == 4) {
  219.             this->operation == 0; //operacja - sumowanie
  220.             char last;
  221.             do {
  222.                 std::cout << "Czy to ostatnie liczby? t/n: ";
  223.                 std::cin >> last;
  224.             } while (last != 't' && last != 'n');
  225.  
  226.             if (last == 't')status = 5; //wyslij serwerowi informacje ze to ostatnia liczba
  227.             else status = 4; //wyslij informacje serwerowi ze beda przesylane liczby
  228.         }
  229.  
  230.         createPacket();
  231.  
  232.     }
  233.  
  234.  
  235.     //zapisanie przyslanego pakietu
  236.     void setPacket(unsigned char* packet) {
  237.         for (int i = 0; i < 12; i++)this->packet[i] = packet[i];
  238.     }
  239.     //zwrocenie pakietu do przeslania
  240.     void getPacket(unsigned char* packet) {
  241.         for (int i = 0; i < 12; i++)packet[i] = this->packet[i];
  242.     }
  243.  
  244.  
  245.     std::bitset<89> getBinaryData() {
  246.         return this->binaryData;
  247.     }
  248.  
  249.     void setId(int id) {
  250.         this->id = id;
  251.     }
  252.  
  253.     int getOperation() {
  254.         return this->operation;
  255.     }
  256.  
  257.     int getStatus() {
  258.         return this->status;
  259.     }
  260.  
  261.     int getId() {
  262.         return this->id;
  263.     }
  264.  
  265.     int getProduct() {
  266.         return this->number1;
  267.     }
  268.  
  269.     void showStructure() {
  270.         std::cout << operation << " " << number1 << " " << number2 << " " << number3 << " " << status << " " << id << " " << sizeNumber1 << " " << sizeNumber2 << " " << sizeNumber3 << std::endl;
  271.     }
  272.  
  273.     void showPacket() {
  274.         for (int i = 0; i < binaryData.size(); i++) {
  275.             std::cout << binaryData[i];
  276.             if (i != 0 && i % 8 == 0) std::cout << " ";
  277.         }
  278.         std::cout << std::endl;
  279.     }
  280.  
  281. };
  282.  
  283. class Connection {
  284.     int CLIENTPORT;
  285.  
  286.     sockaddr_in client;
  287.     sockaddr_in server;
  288.     WSADATA wsaData;
  289.     SOCKET mainSocket;
  290.  
  291.     int bytesSent;
  292.     int bytesRecv = -1;
  293.     Packet packet;
  294.     unsigned char packetRecived[12];
  295.     unsigned char packetSent[12];
  296.  
  297. public:
  298.     Connection() {
  299.         CLIENTPORT = rand() % 1000 + 5000;
  300.  
  301.         memset(&client, 0, sizeof(client));
  302.         client.sin_family = AF_INET;
  303.         client.sin_addr.s_addr = inet_addr("127.0.0.1");
  304.         client.sin_port = htons(CLIENTPORT);
  305.  
  306.         memset(&server, 0, sizeof(server));
  307.         server.sin_family = AF_INET;
  308.         server.sin_addr.s_addr = inet_addr("127.0.0.1");
  309.         server.sin_port = htons(SERVERPORT);
  310.     }
  311.  
  312.     bool connect() {
  313.         int result = WSAStartup(MAKEWORD(2, 2), &wsaData); //wybor wersji winsock
  314.         if (result != NO_ERROR)
  315.             std::cout << "Blad inicjalizacji" << std::endl;
  316.  
  317.         mainSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //tworzenie socketu UDP
  318.         if (mainSocket == INVALID_SOCKET)
  319.         {
  320.             std::cout << "Blad podczas tworzenia socketu: " << WSAGetLastError() << std::endl;
  321.             WSACleanup();
  322.             return 0;
  323.         }
  324.  
  325.         //przypisanie socketu do adresu
  326.         if (bind(mainSocket, (SOCKADDR *)& client, sizeof(client)) == SOCKET_ERROR)
  327.         {
  328.             std::cout << "bind() zakonczony niepoowdzeniem " << std::endl;
  329.             closesocket(mainSocket);
  330.             return 0;
  331.         }
  332.     }
  333.  
  334.     void requestId() {
  335.         //Wyslij poczatkowy pakiet proszacy o id
  336.         for (int i = 0; i < 12; i++)packetSent[i] = 0;
  337.         bytesSent = sendto(mainSocket, (char*)packetSent, sizeof(packetSent), 0,
  338.             (struct sockaddr *) & server, sizeof(struct sockaddr));
  339.     }
  340.  
  341.     void sendData() {
  342.         int operation;
  343.         std::cout << "Jaka operacje chcesz wykonac? \n0.Dodawanie \n1.Mnozenie \n2.Odejmowanie \n3.Dzielenie \n4.Suma wielu liczb\n";
  344.         do {
  345.             std::cin >> operation;
  346.         } while (operation<0 || operation>4);
  347.  
  348.         packet.inputData(operation);
  349.  
  350.         packet.getPacket(packetSent);
  351.  
  352.         bytesSent = sendto(mainSocket, (char *)packetSent, sizeof(packetSent), 0,
  353.             (struct sockaddr *) & server, sizeof(struct sockaddr));
  354.  
  355.         //jezeli wybrano opcje sumowania wielu liczb i nie sa to ostatnie liczby
  356.         while (operation == 4 && packet.getStatus() == 4) {
  357.             packet.inputData(operation);
  358.             packet.getPacket(packetSent);
  359.             bytesSent = sendto(mainSocket, (char *)packetSent, sizeof(packetSent), 0,
  360.                 (struct sockaddr *) & server, sizeof(struct sockaddr));
  361.         }
  362.  
  363.     }
  364.  
  365.     void reciveData(){
  366.         int addr_len = sizeof(struct sockaddr);
  367.        
  368.         bytesRecv = recvfrom(mainSocket, (char *)&packetRecived, sizeof(packetRecived), 0,
  369.             (struct sockaddr *) & client, &addr_len);
  370.  
  371.         packet.decodePacket(packetRecived);
  372.         int status = packet.getStatus();
  373.         switch (status) {
  374.         case 1: //nadanie id
  375.             std::cout << "Otrzymano id: " << packet.getId() << std::endl;
  376.             break;
  377.         case 3: //odebranie wyniku dzialania arytmetycznego
  378.             std::cout << "Wynik dzialania: " << packet.getProduct() << std::endl; //serwer zawsze zwraca wynik w 1 liczie
  379.             break;
  380.         case 6: //blad
  381.             std::cout << "Blad!" << std::endl;
  382.         default: //nieokreslone
  383.             std::cout << "Nieokreslone" << std::endl;
  384.             break;
  385.         }
  386.     }
  387.    
  388. };
  389.  
  390. int main(void)
  391. {
  392.     srand(time(NULL));
  393.     Connection connection;
  394.     connection.connect();
  395.     connection.requestId();
  396.  
  397.     while (true) {
  398.         connection.reciveData();
  399.         connection.sendData();
  400.     }
  401.    
  402.     system("PAUSE");
  403.  
  404.     return 0;
  405. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement