Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.14 KB | None | 0 0
  1. //////KLIENT
  2. //o nawiązanie połączenia z serwerem,
  3. //o uzyskanie identyfikatora sesji,
  4. //o przesłanie pojedynczej liczby L,
  5. //o przesyłanie wartości liczbowych, będących „odpowiedziami” :
  6. //o klient ma odgadnąć liczbę wylosowaną przez serwer.
  7. //o zakończenie połączenia.
  8.  
  9. /////////////OPERACJE
  10. //1 - przesłanie id
  11. //2 - przesłanie liczby
  12. //3 - przesłanie zakresu
  13. //4 - przesłanie informacji
  14.  
  15. //////////////ODPOWIEDZ
  16. //1 - od serwera
  17. //2 - od klienta
  18.  
  19.  
  20. #pragma comment(lib,"ws2_32.lib")
  21. #pragma warning(disable : 4996)
  22. #include <WinSock2.h>
  23. #include <iostream>
  24. #include <ctime>
  25. #include <cstdlib>
  26. #include <string>
  27. #include <bitset>
  28. using namespace std;
  29.  
  30.  
  31. /////////////////////////////////////////////////////////////////////////////////////
  32. int bin_int(const string &s) {//funkcja przyjmuje string=liczba binarna, i zwraca liczbę int odpowiadającą tej liczbie binarnej
  33. int a = 0;
  34. int p = 1;
  35. for (int i = s.size() - 1; i >= 0; i--) {
  36. if (s[i] == '1') a = a + p;
  37. p = p * 2;
  38. }
  39. return a;
  40. }
  41. string int_bin(const int &a) {//bin_int tylko że na odwrót
  42. int a2 = a;
  43. string s = "";
  44. for (; a2 > 0;) {
  45. if (a2 % 2 == 0) {
  46. a2 = a2 / 2;
  47. s = s + "0";
  48. }
  49. else {
  50. a2 = a2 / 2;
  51. s = s + "1";
  52. }
  53. }
  54. string wynik = "";
  55. for (int i = s.size() - 1; i >= 0; i--) wynik = wynik + s[i];
  56. return wynik;
  57. }
  58.  
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. union unia {
  61. char unia1;
  62. bitset<8> unia2;
  63. };
  64. void pakowanie(char pakiet[6], int &OPERA, int &OD1, int &ID, int &OD2) {//procesura wstawia do pakietu binarne odpowiedniki podanych zmiennych - puste pola zapełnia zerami
  65. string a = "0000";//żeby było dokładnie 48 bitów a nie 44
  66.  
  67. string opera2 = int_bin(OPERA);//puste pola zapełniam zerami - żeby mieć dokładnie 6 znaków
  68. while (opera2.size() < 6) {
  69. opera2 = "0" + opera2;
  70. }
  71. string od12 = int_bin(OD1);//puste pola zapełniam zerami - żeby mieć dokładnie 3 znaki
  72. while (od12.size() < 3) {
  73. od12 = "0" + od12;
  74. }
  75. string id2 = int_bin(ID);//puste pola zapełniam zerami - żeby mieć dokładnie 3 znaki
  76. while (id2.size() < 3) {
  77. id2 = "0" + id2;
  78. }
  79. string od22 = int_bin(OD2);//puste pola zapełniam zerami - żeby mieć dokładnie 32 znaki
  80. while (od22.size() < 32) {
  81. od22 = "0" + od22;
  82. }
  83.  
  84. a = a + opera2 + od12 + id2 + od22;//sumuje sobie tego stringa - ma 48 bitów w tym 4 pierwsze = nieznaczące zera
  85.  
  86. unia unia{ '0' };//zapisuję dane do pakietu pod postacią odpowiednich znaków
  87. int aa;
  88. bitset<8> b;
  89. for (int i = 0; i < 6; i++) {
  90. aa = bin_int(a.substr(i * 8, 8));
  91. b = aa;
  92. unia.unia2 = b;
  93. pakiet[i] = unia.unia1;
  94. }
  95. }
  96.  
  97. void odpakowanie(char pakiet[6], int &OPERA, int &OD1, int &ID, int &OD2) {//procedura z podanego pakietu odfiltrowuje 4 odpowiednie binarne liczby, zamienia je na dziesiętne. Następnie wartość 4 podanych zmiennych jest ustawiana na te wartości dziesiętne
  98. string s = "";
  99. unia unia{ '0' };
  100.  
  101. for (int i = 0; i < 6; i++) {
  102. unia.unia1 = pakiet[i];
  103. s = s + unia.unia2.to_string();
  104. }
  105.  
  106. s = s.substr(4, 44);//usuwa te 4 zera z przodu
  107. OPERA = bin_int(s.substr(0, 6));
  108. OD1 = bin_int(s.substr(6, 3));
  109. ID = bin_int(s.substr(9, 3));
  110. OD2 = bin_int(s.substr(12, 32));
  111. }
  112.  
  113. void zerowanie(char pakiet[6]) {
  114. bitset<8> a = 0;
  115. unia unia{ '0' };
  116. unia.unia2 = a;
  117. for (int i = 0; i < 6; i++) {
  118. pakiet[i] = unia.unia1;
  119. }
  120. }
  121.  
  122.  
  123.  
  124.  
  125.  
  126. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  127. int main() {
  128. char pakiet[6];
  129. zerowanie(pakiet);
  130.  
  131. int OPERA = 0;
  132. int OD1 = 0;
  133. int OD2 = 0;
  134. int ID = 0;
  135.  
  136. srand(time(NULL));
  137. ///Winsock Start
  138. WSAData wsaData;
  139. WORD DLLVersion = MAKEWORD(2, 1);
  140. if (WSAStartup(DLLVersion, &wsaData) != 0) ///jesli jest error
  141. {
  142. MessageBoxA(NULL, "Winsock startup failed", "Error", MB_OK | MB_ICONERROR);
  143. exit(1);
  144. }
  145.  
  146. SOCKADDR_IN addr; ///Adresy socketow
  147. int sizeofaddr = sizeof(addr); //wielkosc adresow
  148. addr.sin_addr.s_addr = inet_addr/*("192.168.2.100")*/("127.127.127.127"); //localhost (ten pc)
  149. addr.sin_port = htons(1111); //Port
  150. addr.sin_family = AF_INET; //IPv4 Socket (mozna dac 6)
  151.  
  152. SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL); //stawiamy socketa
  153. if (connect(Connection, (SOCKADDR*)&addr, sizeofaddr) != 0) //jesli sie nie udalo
  154. {
  155. MessageBoxA(NULL, "Failed to Connect", "Error", MB_OK | MB_ICONERROR);
  156. return 0;
  157. }
  158.  
  159. std::cout << "Connected!" << std::endl;
  160. /////////////////////////////////////////////////////////////////////////////////
  161. system("pause");
  162. recv(Connection, pakiet, sizeof(pakiet), NULL); /// otrzymujemy identyfikator
  163. odpakowanie(pakiet, OPERA, OD1, ID, OD2);
  164.  
  165. cout << "Prosze podac liczbe" << endl;
  166. int L1;
  167. cin >> L1;
  168.  
  169. OPERA = 2; ///wysylamy liczbe
  170. OD1 = 0; ///jestesmy klientem
  171. OD2 = L1; ///wysylamy L1
  172.  
  173. pakowanie(pakiet, OPERA, OD1, ID, OD2);///pakujemy liczbe
  174. send(Connection, pakiet, sizeof(pakiet), NULL); /////// wysylamy Liczbe
  175.  
  176. recv(Connection, pakiet, sizeof(pakiet), NULL);///otrzymujemy przedział min
  177. odpakowanie(pakiet, OPERA, OD1, ID, OD2);///wypakować przedział min
  178. int min = OD2;
  179.  
  180. recv(Connection, pakiet, sizeof(pakiet), NULL);///otrzymujemy przedział max
  181. odpakowanie(pakiet, OPERA, OD1, ID, OD2);///wypakować przedział max
  182. int max = OD2;
  183. //////////////////////////////////////////////////////////////////////////////
  184.  
  185. boolean traf = 0;
  186. while (traf == 0) {
  187. cout << "Przedzial liczbowy wynosi: " << min << " - " << max << endl << "Prosze podac strzelana liczbe" << endl;
  188. cin >> L1;
  189.  
  190. OPERA = 2; ///wysylamy liczbe
  191. OD1 = 0;
  192. OD2 = L1;
  193.  
  194. pakowanie(pakiet, OPERA, OD1, ID, OD2);////pakujemy
  195. send(Connection, pakiet, sizeof(pakiet), NULL); ////wysylamy strzal
  196. recv(Connection, pakiet, sizeof(pakiet), NULL); ///odbieramy info o strzale
  197. odpakowanie(pakiet, OPERA, OD1, ID, OD2);///odpakowac
  198. traf = OD2; ///OD2=1 if hit
  199. if (traf == 0) {
  200. cout << "Nie trafilismy! :( " << endl;
  201. }
  202. }
  203. std::cout << "Trafilismy!" << std::endl;
  204. shutdown(Connection, 2);
  205. system("pause");
  206.  
  207. return 0;
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement