Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.80 KB | None | 0 0
  1. //Client
  2. #pragma comment(lib,"ws2_32.lib")
  3. #include <WS2tcpip.h>
  4. #include <iostream>
  5. #include <string>
  6. #include <minwinbase.h>
  7. #include <bitset>
  8. #include <sstream>
  9.  
  10. std::string zamianaBNS(std::string data)
  11. {
  12.     std::stringstream sstream(data);
  13.     std::string output;
  14.     while (sstream.good())
  15.     {
  16.         std::bitset<8> bits;
  17.         sstream >> bits;
  18.         char c = char(bits.to_ulong());
  19.         output += c;
  20.     }
  21.  
  22.     return output;
  23. }
  24.  
  25. int convertBinaryToDecimal(long long n)
  26. {
  27.     int decimalNumber = 0, i = 0, remainder;
  28.     while (n != 0)
  29.     {
  30.         remainder = n % 10;
  31.         n /= 10;
  32.         decimalNumber += remainder*pow(2, i);
  33.         ++i;
  34.     }
  35.     return decimalNumber;
  36. }
  37. // Done ale brzydko V
  38. std::string zamianaBND(std::string x)
  39. {
  40.     int n = stoi(x);
  41.     n = convertBinaryToDecimal(n);
  42.     x = std::to_string(n);
  43.     return x;
  44. }
  45. std::string zamianaDNB(std::string x)
  46. {
  47.     int number = stoi(x);
  48.  
  49.     std::bitset<16> mySet(number);
  50.     x = mySet.to_string();
  51.     x.erase(0, min(x.find_first_not_of('0'), x.size() - 1));
  52.     return x;
  53. }
  54.  
  55.  
  56. std::string zamianaSNB(std::string x) //string
  57. {
  58.     std::string wynik;
  59.  
  60.     for (std::size_t i = 0; i < x.size(); ++i)
  61.     {
  62.         std::stringstream stream;
  63.         stream << std::bitset<8>(x[i]);
  64.         wynik += stream.str();
  65.     }
  66.  
  67.  
  68.     return wynik;
  69. }
  70.  
  71. std::string encodeBitsToBaits(std::string inputDatagramInBits)
  72. {
  73.     // Dopelnienie zerami, jesli jest taka potrzeba
  74.     while (inputDatagramInBits.size() % 8 != 0)
  75.     {
  76.         inputDatagramInBits.push_back('0');
  77.     }
  78.  
  79.     // Po uzupelnieniu pakiet jest gotowy do zamiany na bajty
  80.  
  81.     int datagramLength = inputDatagramInBits.size();
  82.  
  83.     char bait = 0; // Zmienna bait bedzie zapisywala kolejne osemki bitow
  84.     std::string datagramInBaits; // PakietBajtow to gotowy lancuch bajtow
  85.     int operationIndex = 0; // Zmienna OperationIndeks jest niezbedna przy operacjach na bitach
  86.  
  87.                             // Zmienna i wskazuje na pierwszy bit z danej osemki bitow
  88.     for (int i = 0; i < datagramLength; i += 8)
  89.     {
  90.         bait = 0;
  91.         operationIndex = 0;
  92.  
  93.         // Zmienna j iteruje po osmiu kolejnych bitach zaczynajac od bitu i. Jesli bit jest jedynka, to jedynka zostaje przesunieta na odpowiednia pozycje
  94.         for (int j = i; j < i + 8; ++j)
  95.         {
  96.             if (inputDatagramInBits[j] == '1')
  97.             {
  98.                 bait = bait | 1 << (7 - operationIndex);
  99.             }
  100.             operationIndex++;
  101.         }
  102.  
  103.         // Dopisanie gotowego bajtu danych do zmiennej datagramInBaits
  104.         datagramInBaits.push_back(bait);
  105.     }
  106.  
  107.     // Zwrocenie datagramu, w ktorym kazdy znak zapisuje 8 bitow
  108.     return datagramInBaits;
  109. }
  110.  
  111. std::string decodeBaitsToBits(std::string inputDatagramInBaits)
  112. {
  113.     std::string datagramInBits;
  114.     std::string bits;
  115.     // Zmienna i iteruje po kolejnych bajtach az do konca lancucha znakow
  116.     for (int i = 0; i < inputDatagramInBaits.size(); i++)
  117.     {
  118.         bits.clear();
  119.         // Zapisanie danego znaku jako liczby i zapisanie tej liczby do bitset
  120.         int charAsInteger = inputDatagramInBaits[i];
  121.         std::bitset<8> mySet(charAsInteger);
  122.  
  123.         // Zapisanie danego bajtu jako ciagu zer i jedynek o dlugosci 8 do zmiennej bits
  124.         bits = mySet.to_string();
  125.  
  126.         //Dopisanie osmiu zer i jedynek do wynikowego datagramu
  127.         datagramInBits += bits;
  128.     }
  129.  
  130.     //Zwrocenie datagramu, w ktorym kazdy znak ma wartosc 1 lub 0
  131.     return datagramInBits;
  132. }
  133.  
  134. std::string poprawnyOdbior(char input[4096])
  135. {
  136.     std::string temp;
  137.     std::string odpowiedz;
  138.     std::string rozmiarBin;
  139.     std::string jedynaslusznaodpowiedz;
  140.     int rozmiarDec;
  141.     for (int i = 0; i < 9; i++)
  142.     {
  143.         temp += input[i];
  144.     }
  145.  
  146.     temp = decodeBaitsToBits(temp);
  147.     for (int i = 5; i < 69; i++)
  148.     {
  149.         rozmiarBin += temp[i];
  150.     }
  151.  
  152.     rozmiarDec = stoi(zamianaBND(rozmiarBin));
  153.  
  154.     int rozmiarCalegoPakietuWBajtach = ((68 + rozmiarDec) / 8);
  155.  
  156.     if (((68 + rozmiarDec) % 8) > 0) rozmiarCalegoPakietuWBajtach += 1;
  157.  
  158.     for (int i = 0; i <= rozmiarCalegoPakietuWBajtach; i++)
  159.     {
  160.         odpowiedz += input[i];
  161.     }
  162.  
  163.     jedynaslusznaodpowiedz = decodeBaitsToBits(odpowiedz);
  164.  
  165.     while (jedynaslusznaodpowiedz.size() > (69 + rozmiarDec))
  166.     {
  167.         jedynaslusznaodpowiedz.pop_back();
  168.     }
  169.  
  170.     return jedynaslusznaodpowiedz;
  171. }
  172.  
  173. void prepare(std::string &komunikacja, std::string size, std::string dane)
  174. {
  175.     //komunikacja.erase(komunikacja.begin() + 77, komunikacja.end());
  176.     for (int i = 0; i <64; i++)
  177.     {
  178.         komunikacja[5 + i] = size[i];
  179.     }
  180.     for (int i = 0; i<dane.size(); i++)
  181.     {
  182.         komunikacja.push_back(dane[i]);
  183.     }
  184.  
  185.     std::string temporary = encodeBitsToBaits(komunikacja);
  186.     komunikacja = temporary;
  187. }
  188.  
  189. void prepareS(std::string &komunikacja, std::string size, std::string dane)
  190. {
  191.     komunikacja.erase(komunikacja.begin() + 75, komunikacja.end());
  192.     for (int i = 0; i <64; i++)
  193.     {
  194.         komunikacja[5 + i] = size[i];
  195.     }
  196.     for (int i = 0; i<dane.size(); i++)
  197.     {
  198.         komunikacja.push_back(dane[i]);
  199.     }
  200.  
  201.     std::string temporary = encodeBitsToBaits(komunikacja);
  202.     komunikacja = temporary;
  203. }
  204.  
  205. void main()
  206. {
  207.     //dane serwera
  208.     std::string ipAddres = "127.0.0.1";
  209.     int port = 8888;
  210.     //Winsock Startup
  211.     WSAData wsaData;
  212.     WORD DllVersion = MAKEWORD(2, 1);
  213.     if (WSAStartup(DllVersion, &wsaData) != 0)
  214.     {
  215.         std::cout << "Nie mozna uruchomic Winsock" << std::endl;
  216.         return;
  217.     }
  218.  
  219.     // Create socket
  220.     SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
  221.     if (sock == INVALID_SOCKET)
  222.     {
  223.         std::cout << "Nie mozna stworzyc Wincosk" << std::endl;
  224.         return;
  225.     }
  226.  
  227.     // Bind the ip address and port to a socket
  228.  
  229.     sockaddr_in hint;
  230.     hint.sin_family = AF_INET;//IPv4
  231.     hint.sin_port = htons(port);//host to network short - rozwiazuje problemy z big i little indian, port
  232.     inet_pton(AF_INET, ipAddres.c_str(), &hint.sin_addr);
  233.  
  234.     //connect
  235.  
  236.     /*int connectionResult = connect(sock, (sockaddr*)&hint, sizeof(hint));
  237.     if (connectionResult == SOCKET_ERROR)
  238.     {
  239.     std::cout << "nie mozna polaczyc" << std::endl;
  240.     closesocket(sock);
  241.     WSACleanup();
  242.     return;
  243.     }*/
  244.     //while loop
  245.     int operacja, liczba1, liczba2;
  246.     char buff[4096];
  247.     std::string Input;
  248.     std::string komunikacja(69, '0');//tym sie komunikujemy, inicjalizacja jako 000 status 00 operacja, ktora jest pomijalna, i rozmiar danych rowniez = 0 oo i jeszcze nr sesji trzeba
  249.  
  250.     do {
  251.         operacja = 0;
  252.         //Inicjalizacja
  253.         if (komunikacja[0] == '0' && komunikacja[1] == '0' && komunikacja[2] == '0'&& komunikacja[3] == '0' && komunikacja[4] == '0') // jezeli jeszcze nie mamy nr sesji
  254.         {
  255.             std::string temporary;
  256.             temporary = encodeBitsToBaits(komunikacja);
  257.             komunikacja = temporary;
  258.        
  259.             sendto(sock, komunikacja.c_str(), komunikacja.size(), 0, (struct sockaddr *) &hint, sizeof(hint));
  260.             recv(sock, buff, 4096, 0);
  261.            
  262.             komunikacja = poprawnyOdbior(buff);
  263.             std::cout << "komunikacja3 : " << komunikacja << std::endl;
  264.  
  265.             operacja = 666; // zeby mi pentli nie przerwalo lol
  266.         }
  267.         else {
  268.  
  269.             std::cin >> operacja;// tu wybieramy operacje wg klucza 1 2 3 4 5 6 zgodnie z kolejnoscia na serwerze, 0 zamyka
  270.             if (operacja < 5 && operacja >0)
  271.             {
  272.                 std::cin >> liczba1;
  273.                 std::cin >> liczba2; // podajemy 2 liczby np do dodania, rowniez jakis tekst by sie przydal chyba
  274.             }
  275.             if (operacja == 5) { std::cin >> liczba1; } // tu tekst o liczbie do silniowania
  276.             if (operacja == 6) { /*tu nic nie musi byc bo sprawdzamy tylko nasza sesje*/ }
  277.             if (operacja == 7)
  278.             {
  279.                 do {
  280.                     std::cin >> liczba1;
  281.                 } while (liczba1 < 0 || liczba1 >4);
  282.  
  283.             } // tu wpisujemy liczbe oznaczajaca operacje matematyczna ktorej historie chcemy sprawdzic (kody jak serwer i klient 1 2 3 4)
  284.             else if (operacja >6 || operacja <0) { std::cout << "nie denerwuj mnie ok?"; }
  285.            
  286.             komunikacja.erase(komunikacja.begin() + 75, komunikacja.end());
  287.             if (operacja > 0 && operacja <7)
  288.             {
  289.                 std::string dane_do_wyslania = "";
  290.                 if (operacja == 1)
  291.                 {
  292.                     komunikacja[0] = '1';
  293.                     komunikacja[1] = '0';
  294.                     komunikacja[2] = '1';
  295.                     komunikacja[3] = '1';
  296.                     komunikacja[4] = '0'; // operacja i flagi
  297.                     komunikacja.push_back('0');
  298.                     komunikacja.push_back('0');
  299.                     dane_do_wyslania = std::to_string(liczba1) + " " + std::to_string(liczba2);
  300.  
  301.                 }
  302.  
  303.                 if (operacja == 2)
  304.                 {
  305.                     komunikacja[0] = '1';
  306.                     komunikacja[1] = '0';
  307.                     komunikacja[2] = '1';
  308.                     komunikacja[3] = '1';
  309.                     komunikacja[4] = '0'; // operacja i flagi
  310.                     komunikacja.push_back('0');
  311.                     komunikacja.push_back('1');
  312.                     dane_do_wyslania = std::to_string(liczba1) + " " + std::to_string(liczba2);
  313.                 }
  314.  
  315.                 if (operacja == 3)
  316.                 {
  317.  
  318.                     komunikacja[0] = '1';
  319.                     komunikacja[1] = '0';
  320.                     komunikacja[2] = '1';
  321.                     komunikacja[3] = '1';
  322.                     komunikacja[4] = '0'; // operacja i flagi
  323.                     komunikacja.push_back('1');
  324.                     komunikacja.push_back('0');
  325.                     dane_do_wyslania = std::to_string(liczba1) + " " + std::to_string(liczba2);
  326.                 }
  327.  
  328.                 if (operacja == 4)
  329.                 {
  330.                     komunikacja[0] = '1';
  331.                     komunikacja[1] = '0';
  332.                     komunikacja[2] = '1';
  333.                     komunikacja[3] = '1';
  334.                     komunikacja[4] = '0'; // operacja i flagi
  335.                     komunikacja.push_back('1');
  336.                     komunikacja.push_back('1');
  337.                     dane_do_wyslania = std::to_string(liczba1) + " " + std::to_string(liczba2);
  338.  
  339.                 }
  340.  
  341.                 if (operacja == 5)
  342.                 {
  343.                     komunikacja[0] = '0';
  344.                     komunikacja[1] = '1';
  345.                     komunikacja[2] = '1';
  346.                     komunikacja[3] = '1';
  347.                     komunikacja[4] = '0'; // operacja i flagi
  348.                     dane_do_wyslania = std::to_string(liczba1);
  349.  
  350.                 }
  351.  
  352.                 if (operacja == 6)
  353.                 {
  354.                     komunikacja[0] = '0';
  355.                     komunikacja[1] = '0';
  356.                     komunikacja[2] = '1';
  357.                     komunikacja[3] = '0';
  358.                     komunikacja[4] = '0'; // operacja i flagi
  359.                 }
  360.                 if (operacja != 6) {
  361.                     dane_do_wyslania = zamianaSNB(dane_do_wyslania); //dane sa jako binarne juz
  362.                 }
  363.                 else
  364.                 {
  365.                     switch (liczba1)
  366.                     {
  367.                     case 1: dane_do_wyslania = "00"; break;
  368.                     case 2: dane_do_wyslania = "01"; break;
  369.                     case 3: dane_do_wyslania = "10"; break;
  370.                     case 4: dane_do_wyslania = "11"; break;
  371.                     }
  372.  
  373.                 }
  374.                 int number;
  375.  
  376.                 if (operacja == 1 || operacja == 2 || operacja == 3 || operacja == 4)
  377.                 {
  378.                     number = dane_do_wyslania.size() + 8;  // ====================================== dodalem + 6
  379.                 }
  380.                 else if (operacja == 5)
  381.                 {
  382.                     number = dane_do_wyslania.size() + 6;  // ====================================== dodalem + 6
  383.                 }
  384.  
  385.                 std::string rozmiar = std::to_string(number);
  386.                 std::bitset<64> mySet(number);
  387.                 rozmiar = mySet.to_string(); //rozmiar jako binarny  64
  388.  
  389.                 prepare(komunikacja, rozmiar, dane_do_wyslania);
  390.  
  391.                 int sendResult = sendto(sock, komunikacja.c_str(), komunikacja.size(), 0, (struct sockaddr *) &hint, sizeof(hint));
  392.                 if (sendResult != SOCKET_ERROR)
  393.                 {
  394.                     ZeroMemory(buff, 4096);
  395.                     int hintSize = sizeof(hint); // &(sizeof(hint))
  396.                     int Recieved = recvfrom(sock, buff, 4096, 0, (struct sockaddr *) &hint, &hintSize);
  397.  
  398.  
  399.                     if (Recieved > 0)
  400.                     {
  401.                         komunikacja = poprawnyOdbior(buff);// teraz mamy odpowiedz w komunikacji
  402.  
  403.                         std::string op, flg, dldan, ses, odp, dzial;
  404.                         op.push_back(komunikacja[0]); op.push_back(komunikacja[1]);
  405.                         flg.push_back(komunikacja[2]); flg.push_back(komunikacja[3]); flg.push_back(komunikacja[4]);
  406.                         for (int i = 5; i < 69; i++) { dldan.push_back(komunikacja[i]); }
  407.                         dldan = zamianaBND(dldan);
  408.                         for (int i = 69; i < 75; i++)
  409.                         {
  410.                             ses.push_back(komunikacja[i]);
  411.                         }
  412.                         ses = zamianaBND(ses);
  413.                         for (int i = 75; i< 77; i++)
  414.                         {
  415.                             dzial.push_back(komunikacja[i]);
  416.                         }
  417.                         dzial = zamianaBND(dzial);
  418.                         for (int i = 77; i< komunikacja.size(); i++)
  419.                         {
  420.                             odp.push_back(komunikacja[i]);
  421.                         }
  422.                         if (operacja < 5) {
  423.                             odp = zamianaBND(odp);
  424.                         }
  425.                         else odp = zamianaBNS(odp);
  426.  
  427.                         std::cout << std::endl << std::endl << std::endl << op << std::endl << flg << std::endl << dldan << std::endl << ses << std::endl << odp << std::endl;
  428.                         // TO DO CO Z TYM ZROBIC DALEJ MAMY ( PEWNIE JAKIES ODPOWIEDZI W ZALEZNOSCI OD STATUSU ODPOWIEDZI I OPERACJI CZY COS
  429.  
  430.                         std::cout << "uff";
  431.  
  432.                     }
  433.                 }
  434.             }
  435.         }
  436.     } while (operacja != 0);
  437.  
  438.  
  439.     closesocket(sock);
  440.     WSACleanup();
  441. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement