Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.19 KB | None | 0 0
  1. //server
  2. #pragma comment(lib, "ws2_32.lib")
  3. #include <WinSock2.h>
  4. #include <iostream>
  5. #include <WS2tcpip.h>
  6. #include <fstream>
  7. #include <vector>
  8. #include <string>
  9. #include <process.h> //biblioteka do watkow
  10.  
  11. using namespace std;
  12.  
  13. int IDInt = 0; //zmienna okreslajca ID klienta
  14.  
  15. //zamiana z dziesiętnego na binarny//
  16. vector<bool> DecBin(int number, int size) {
  17.     vector<bool> tab(size);  //
  18.     int i = size - 1;
  19.     while (number) {
  20.         tab[i--] = number % 2;
  21.         number /= 2;
  22.     }
  23.     return tab;
  24. }
  25.  
  26. //zamiana z binarnego na dziesietny//
  27. int BinDec(vector<bool> tab, int size) {
  28.     int d = 0;
  29.     for (int i = 0;i < size;i++) {
  30.         int z = tab[i] * pow(2, size - i - 1);
  31.         d += z;
  32.     }
  33.     return d;
  34. }
  35.  
  36. //zamiana char na int//
  37. char CharInt(int number) {
  38.     char chx = static_cast<char>(number);
  39.     return chx;
  40. }
  41.  
  42. //zamiana int na char//
  43. int IntChar(char c) {
  44.     int n = static_cast<int>(c);
  45.     return n;
  46. }
  47.  
  48. //konwetownie vec bool na int//
  49. vector<int> ToBin(vector<bool> buffor) {
  50.  
  51.     vector<int> bufInt;
  52.     int w = buffor.size() / 8;
  53.     for (int i = 0; i < w; i++) {
  54.         int n = i * 8;
  55.         vector<bool> pom(8);
  56.  
  57.         for (int j = 0; j < 8;j++) {
  58.             pom[j] = buffor[n + j];
  59.  
  60.         }
  61.         int zm = BinDec(pom, 8);//zmiana na int
  62.  
  63.         bufInt.push_back(zm);
  64.     }
  65.  
  66.     return bufInt;
  67. }
  68.  
  69. //konwertowanie bool na char//
  70. vector<char> BinToChar(vector<bool> buffer) {
  71.     vector<char> bufChar;
  72.     vector<int> bufInt = ToBin(buffer); //zwraca wektor int
  73.     int size = bufInt.size();
  74.     char zm;
  75.     for (int i = 0; i < size;i++) {
  76.         zm = IntChar(bufInt[i]);
  77.         bufChar.push_back(zm);
  78.     }
  79.     return bufChar;
  80. }
  81.  
  82. //konwersja z char na int
  83. vector<int> CharToInt(vector<char> buffer) {
  84.     vector<int> bufInt;
  85.     int size = buffer.size();
  86.     int zm;
  87.     for (int i = 0; i< size;i++) {
  88.         zm = CharInt(buffer[i]);
  89.         bufInt.push_back(zm);
  90.     }
  91.     return bufInt;
  92. }
  93.  
  94. //konwersja z int na bool
  95. vector<bool> IntToBin(vector<int> buffer) {
  96.     vector<bool> bufBin;
  97.     vector<bool>pom;
  98.     int size = buffer.size();
  99.     for (int i = 0; i < size;i++) {
  100.         int n = i * 8;
  101.         int zm = buffer[i];
  102.         pom = DecBin(zm, 8);
  103.         for (int j = 0; j < 8;j++) {
  104.             bufBin.push_back(pom[j]);
  105.         }
  106.     }
  107.     return bufBin;
  108. }
  109.  
  110. //konwersja z char na bit
  111. vector<bool> CharToBin(vector<char> buffer) {
  112.     vector<int> bufInt = CharToInt(buffer); // z char na inty
  113.     vector<bool> bufBit = IntToBin(bufInt); // z int na bool
  114.     return bufBit;
  115. }
  116.  
  117. //funkcje dzialan
  118. int Sub(int a, int b, int c)
  119. {
  120.     int result;
  121.     result = a - b - c;
  122.     return result;
  123. }
  124.  
  125. int Div(int a, int b, int c)
  126. {
  127.     int result;
  128.     result = a / b / c;
  129.     return result;
  130. }
  131.  
  132. int whichMax(int a, int b, int c)
  133. {
  134.     if (a > b) {
  135.         if (a > c) {
  136.             return a;
  137.         }
  138.         else return c;
  139.     }
  140.     else if (b > c) {
  141.         return b;
  142.     }
  143.     else return c;
  144. }
  145.  
  146. int whichMin(int a, int b, int c)
  147. {
  148.     if (a < b) {
  149.         if (a < c) {
  150.             return a;
  151.         }
  152.         else return c;
  153.     }
  154.     else if (b < c) {
  155.         return b;
  156.     }
  157.     else return c;
  158. }
  159.  
  160. //funkcja obslugujaca pojedynczego klienta
  161. unsigned _stdcall ClientSN(void * data)
  162. {
  163.     SOCKET Connection = (SOCKET)data; //konwersja z void*, ktory byl przekonertowany z socket
  164.     int ClientN;
  165.     if (Connection == 0) { //sprawdzamy czy cos poszlo nie tak
  166.         cout << "Blad akceptacji polaczenia.";
  167.     }
  168.     else {
  169.         ClientN = IDInt;
  170.  
  171.         cout << endl << "Klient " << ClientN << " podlaczony." << endl;
  172.  
  173.         //tworzenie buffora
  174.         vector<bool> HeaderBin(176);
  175.         //domyslne wypełniane bufora zerami//
  176.         for (int i = 0; i < 176;i++) {
  177.             HeaderBin[i] = 0;
  178.         }
  179.  
  180.         //ustawienie statusu 0 = POWSTAIE HEADERA
  181.         vector<bool> status(4);
  182.         for (int i = 0; i < 4; i++) {
  183.             status[i] = 0;
  184.         }
  185.  
  186.         //Nadawanie ID Klienta//
  187.         vector<bool> ID = DecBin(IDInt, 6);
  188.  
  189.         IDInt++;
  190.  
  191.         //ustawienie statusu 1 = WYSŁANIE HEADERA Z DANYMI
  192.         status[0] = 0;
  193.         status[1] = 0;
  194.         status[2] = 0;
  195.         status[3] = 1;
  196.         //wypelnianie HEADER BIN danymi//
  197.         for (int i = 98; i < 102;i++) {
  198.             HeaderBin[i] = status[i - 98]; //uzupelnianie statusu
  199.         }
  200.         for (int i = 102; i < 108;i++) {
  201.             HeaderBin[i] = ID[i - 102]; //uzupelnianie ID
  202.         }
  203.         //tworzenie buforu char//
  204.         vector<char> HeaderChar = BinToChar(HeaderBin);
  205.         char Header[22];
  206.         for (int i = 0; i < 22; i++) {
  207.             Header[i] = HeaderChar[i];
  208.         }
  209.  
  210.         //wysyłanie naglowka z danymi do klienta
  211.         send(Connection, Header, 22, NULL);
  212.  
  213.     }
  214.  
  215.         //zamykanie polaczenia przez serwer
  216.  
  217.         cout << "Zamykanie polaczenia z klientem: " << ClientN << endl << endl;
  218.         closesocket(Connection);
  219.    
  220. }
  221.  
  222. int main() {
  223.     WSAData WsaDATA; //zmienna potrzebna do otworzenia socketa
  224.     WORD DllVersion = MAKEWORD(2, 1); //zmienna potrzebna do otworzenia socketa
  225.     if (WSAStartup(DllVersion, &WsaDATA) != 0) //warunek na sprawdzenie czy wszystko jest ok
  226.     {
  227.         MessageBoxA(NULL, "Start Winsocka zostal przerwany.", "Blad", MB_OK | MB_ICONERROR); //wyswietla okno dialogowe windowsa, do testow: MessageBoxA(NULL, "tekst", "tekst", MB_OK);
  228.         exit(1); //wyjscie programu w przypadku bledu
  229.     }
  230.  
  231.     SOCKADDR_IN addr; //struktura odpowiedzialna za adres IP
  232.     int addrlen = sizeof(addr); //przypisujemy wielkosc zmiennej addr do zmiennej dlugos adresu
  233.     inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr.s_addr); //inet_pton odpowiedzialne za konwersje adresu na postac binarna
  234.     addr.sin_port = htons(1111); //port adresu
  235.     addr.sin_family = AF_INET; //af_inet zawsze
  236.  
  237.     SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL); //nasluchujemy
  238.     bind(sListen, (SOCKADDR*)&addr, sizeof(addr)); //przypisujemy adres do socketa
  239.     listen(sListen, SOMAXCONN); //nasluchujemy - maksymalna ilosc klientow, nie robimy n bo problemem jest petla, zeby zakonczyc przyjmowanie klientow ctrl+c
  240.     cout << "Serwer wlaczony. Oczekuje na polaczenia.  \nAby zamknac, wyslij kombinacje klawiszy CTRL+C." << endl << endl;
  241.     SOCKET Connection; //nowe polaczenie (to na ktore oczekujemy musi sie polaczyc)
  242.  
  243.     while (Connection = accept(sListen, (SOCKADDR*)&addr, &addrlen)) {
  244.         // Create a new thread for the accepted client (also pass the accepted client socket).
  245.         unsigned threadID; //ID watku
  246.         HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &ClientSN, (void*)Connection, 0, &threadID); //funkcja ktora tworzy watek, pierwsze dwa parametry nie obchodza nas, ClientSN to funkcja zajmujaca sie danym klientem, Connection to socket z konwersją na void bo tak trzeba
  247.     }
  248.  
  249.    
  250.     return 0;
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement