Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //////KLIENT
- //o nawiązanie połączenia z serwerem,
- //o uzyskanie identyfikatora sesji,
- //o przesłanie pojedynczej liczby L,
- //o przesyłanie wartości liczbowych, będących „odpowiedziami” :
- //o klient ma odgadnąć liczbę wylosowaną przez serwer.
- //o zakończenie połączenia.
- /////////////OPERACJE
- //1 - przesłanie id
- //2 - przesłanie liczby
- //3 - przesłanie zakresu
- //4 - przesłanie informacji
- //////////////ODPOWIEDZ
- //1 - od serwera
- //2 - od klienta
- #pragma comment(lib,"ws2_32.lib")
- #pragma warning(disable : 4996)
- #include <WinSock2.h>
- #include <iostream>
- #include <ctime>
- #include <cstdlib>
- #include <string>
- #include <bitset>
- using namespace std;
- /////////////////////////////////////////////////////////////////////////////////////
- int bin_int(const string &s) {//funkcja przyjmuje string=liczba binarna, i zwraca liczbę int odpowiadającą tej liczbie binarnej
- int a = 0;
- int p = 1;
- for (int i = s.size() - 1; i >= 0; i--) {
- if (s[i] == '1') a = a + p;
- p = p * 2;
- }
- return a;
- }
- string int_bin(const int &a) {//bin_int tylko że na odwrót
- int a2 = a;
- string s = "";
- for (; a2 > 0;) {
- if (a2 % 2 == 0) {
- a2 = a2 / 2;
- s = s + "0";
- }
- else {
- a2 = a2 / 2;
- s = s + "1";
- }
- }
- string wynik = "";
- for (int i = s.size() - 1; i >= 0; i--) wynik = wynik + s[i];
- return wynik;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- union unia {
- char unia1;
- bitset<8> unia2;
- };
- 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
- string a = "0000";//żeby było dokładnie 48 bitów a nie 44
- string opera2 = int_bin(OPERA);//puste pola zapełniam zerami - żeby mieć dokładnie 6 znaków
- while (opera2.size() < 6) {
- opera2 = "0" + opera2;
- }
- string od12 = int_bin(OD1);//puste pola zapełniam zerami - żeby mieć dokładnie 3 znaki
- while (od12.size() < 3) {
- od12 = "0" + od12;
- }
- string id2 = int_bin(ID);//puste pola zapełniam zerami - żeby mieć dokładnie 3 znaki
- while (id2.size() < 3) {
- id2 = "0" + id2;
- }
- string od22 = int_bin(OD2);//puste pola zapełniam zerami - żeby mieć dokładnie 32 znaki
- while (od22.size() < 32) {
- od22 = "0" + od22;
- }
- a = a + opera2 + od12 + id2 + od22;//sumuje sobie tego stringa - ma 48 bitów w tym 4 pierwsze = nieznaczące zera
- unia unia{ '0' };//zapisuję dane do pakietu pod postacią odpowiednich znaków
- int aa;
- bitset<8> b;
- for (int i = 0; i < 6; i++) {
- aa = bin_int(a.substr(i * 8, 8));
- b = aa;
- unia.unia2 = b;
- pakiet[i] = unia.unia1;
- }
- }
- 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
- string s = "";
- unia unia{ '0' };
- for (int i = 0; i < 6; i++) {
- unia.unia1 = pakiet[i];
- s = s + unia.unia2.to_string();
- }
- s = s.substr(4, 44);//usuwa te 4 zera z przodu
- OPERA = bin_int(s.substr(0, 6));
- OD1 = bin_int(s.substr(6, 3));
- ID = bin_int(s.substr(9, 3));
- OD2 = bin_int(s.substr(12, 32));
- }
- void zerowanie(char pakiet[6]) {
- bitset<8> a = 0;
- unia unia{ '0' };
- unia.unia2 = a;
- for (int i = 0; i < 6; i++) {
- pakiet[i] = unia.unia1;
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////
- int main() {
- char pakiet[6];
- zerowanie(pakiet);
- int OPERA = 0;
- int OD1 = 0;
- int OD2 = 0;
- int ID = 0;
- srand(time(NULL));
- ///Winsock Start
- WSAData wsaData;
- WORD DLLVersion = MAKEWORD(2, 1);
- if (WSAStartup(DLLVersion, &wsaData) != 0) ///jesli jest error
- {
- MessageBoxA(NULL, "Winsock startup failed", "Error", MB_OK | MB_ICONERROR);
- exit(1);
- }
- SOCKADDR_IN addr; ///Adresy socketow
- int sizeofaddr = sizeof(addr); //wielkosc adresow
- addr.sin_addr.s_addr = inet_addr/*("192.168.2.100")*/("127.127.127.127"); //localhost (ten pc)
- addr.sin_port = htons(1111); //Port
- addr.sin_family = AF_INET; //IPv4 Socket (mozna dac 6)
- SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL); //stawiamy socketa
- if (connect(Connection, (SOCKADDR*)&addr, sizeofaddr) != 0) //jesli sie nie udalo
- {
- MessageBoxA(NULL, "Failed to Connect", "Error", MB_OK | MB_ICONERROR);
- return 0;
- }
- std::cout << "Connected!" << std::endl;
- /////////////////////////////////////////////////////////////////////////////////
- system("pause");
- recv(Connection, pakiet, sizeof(pakiet), NULL); /// otrzymujemy identyfikator
- odpakowanie(pakiet, OPERA, OD1, ID, OD2);
- cout << "Prosze podac liczbe" << endl;
- int L1;
- cin >> L1;
- OPERA = 2; ///wysylamy liczbe
- OD1 = 0; ///jestesmy klientem
- OD2 = L1; ///wysylamy L1
- pakowanie(pakiet, OPERA, OD1, ID, OD2);///pakujemy liczbe
- send(Connection, pakiet, sizeof(pakiet), NULL); /////// wysylamy Liczbe
- recv(Connection, pakiet, sizeof(pakiet), NULL);///otrzymujemy przedział min
- odpakowanie(pakiet, OPERA, OD1, ID, OD2);///wypakować przedział min
- int min = OD2;
- recv(Connection, pakiet, sizeof(pakiet), NULL);///otrzymujemy przedział max
- odpakowanie(pakiet, OPERA, OD1, ID, OD2);///wypakować przedział max
- int max = OD2;
- //////////////////////////////////////////////////////////////////////////////
- boolean traf = 0;
- while (traf == 0) {
- cout << "Przedzial liczbowy wynosi: " << min << " - " << max << endl << "Prosze podac strzelana liczbe" << endl;
- cin >> L1;
- OPERA = 2; ///wysylamy liczbe
- OD1 = 0;
- OD2 = L1;
- pakowanie(pakiet, OPERA, OD1, ID, OD2);////pakujemy
- send(Connection, pakiet, sizeof(pakiet), NULL); ////wysylamy strzal
- recv(Connection, pakiet, sizeof(pakiet), NULL); ///odbieramy info o strzale
- odpakowanie(pakiet, OPERA, OD1, ID, OD2);///odpakowac
- traf = OD2; ///OD2=1 if hit
- if (traf == 0) {
- cout << "Nie trafilismy! :( " << endl;
- }
- }
- std::cout << "Trafilismy!" << std::endl;
- shutdown(Connection, 2);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement