Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //////Server
- //wygenerowanie identyfikatora sesji,
- //o wylosowanie liczby tajnej z przedziału(L1 - L2; L1 + L2),
- //o przesłanie przedziału, w którym zawiera się liczba do zgadnięcia,
- //o informowanie klientów, czy wartość została odgadnięta.
- #pragma comment(lib,"ws2_32.lib")
- #pragma warning(disable : 4996)
- #include <WinSock2.h>
- #include <iostream>
- #include <string>
- #include <ctime>
- #include <cstdlib>
- #include <bitset>
- using namespace std;
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- int bin_int(const string &s) {
- 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) {
- 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;
- }
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- void pakowanie(char pakiet[15], int &OPERA, int &OD1, int &OD2, int &ID) {//tablica-zawsze działa na oryginale
- int a = OPERA;
- int i = 0;
- for (; a > 0; i++) {
- if (a % 2 == 0) {
- a = a / 2;
- pakiet[15 - i] = '0';
- }
- else {
- a = a / 2;
- pakiet[15 - i] = '1';
- }
- }
- a = OD1;
- for (; a > 0; i++) {
- if (a % 2 == 0) {
- a = a / 2;
- pakiet[15 - i] = '0';
- }
- else {
- a = a / 2;
- pakiet[15 - i] = '1';
- }
- }
- a = OD2;
- for (; a > 0; i++) {
- if (a % 2 == 0) {
- a = a / 2;
- pakiet[15 - i] = '0';
- }
- else {
- a = a / 2;
- pakiet[15 - i] = '1';
- }
- }
- a = ID;
- for (; a > 0; i++) {
- if (a % 2 == 0) {
- a = a / 2;
- pakiet[15 - i] = '0';
- }
- else {
- a = a / 2;
- pakiet[15 - i] = '1';
- }
- }
- }
- void odpakowanie(char pakiet[15], int &OPERA, int &OD1, int &OD2, int &ID) {//tablica-zawsze działa na oryginale
- int a = 0;
- int p = 1;
- for (int i = 5; i >=0; i++) {
- if (pakiet[i] == 1) {
- a = a + p;
- p = p * 2;
- }
- }
- OPERA = a;
- a = 0;
- p = 1;
- for (int i = 8; i >= 6; i++) {
- if (pakiet[i] == 1) {
- a = a + p;
- p = p * 2;
- }
- }
- OD1 = a;
- a = 0;
- p = 1;
- for (int i = 11; i >= 9; i++) {
- if (pakiet[i] == 1) {
- a = a + p;
- p = p * 2;
- }
- }
- OD2 = a;
- a = 0;
- p = 1;
- for (int i = 14; i >= 12; i++) {
- if (pakiet[i] == 1) {
- a = a + p;
- p = p * 2;
- }
- }
- ID = a;
- }
- void zerowanie(char pakiet[15]) {
- for (int i = 0; i < 15; i++) {
- pakiet[i] = 0;
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- int main() {
- char pakiet1[15];
- char pakiet2[15];
- zerowanie(pakiet1);
- zerowanie(pakiet2);
- 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 addrlen = sizeof(addr); //wielkosc adresow
- addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //broadcast locally (tylko my mozemy sie laczyc)
- addr.sin_port = htons(1111); //Port
- addr.sin_family = AF_INET; //IPv4 Socket (mozna dac 6)
- SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL); // Tworzenie socketu do nasłuchiwania
- bind(sListen, (SOCKADDR*)&addr, sizeof(addr)); ///przypisujemy adres do socketa
- listen(sListen, SOMAXCONN); //nasłuchujemy
- SOCKET newConnection1; ///socket holdujacy polaczenie z kientem
- newConnection1 = accept(sListen, (SOCKADDR*)&addr, &addrlen); // akceptujemy polaczenie (jesli 0 = fail)
- SOCKET newConnection2; ///socket holdujacy polaczenie z kientem
- newConnection2 = accept(sListen, (SOCKADDR*)&addr, &addrlen); // akceptujemy polaczenie (jesli 0 = fail)
- if (newConnection1 == 0 || newConnection2 == 0)
- {
- std::cout << "Failed to accept the client's connection." << std::endl;
- return 0;
- }
- else //Jesli sie udalo
- {
- std::cout << "Clients Connected!" << std::endl;
- //OP = POWITANIE;
- //AN = WYSL_IDEN;
- //////////mila//////////
- int ID1 = rand() % 7 + 1;
- int ID2 = rand() % 7 + 1;
- while (ID2 == ID1) {
- ID2 = rand() % 7 + 1;
- }
- //ustawienie parametrów OPERA, OD1, OD2, ID
- pakowanie(pakiet1, OPERA, OD1, OD2, ID);///pakowanie wiadomosci
- //ustawienie parametrów OPERA, OD1, OD2, ID
- pakowanie(pakiet2, OPERA, OD1, OD2, ID);///pakowanie wiadomosci
- ///wyslanie identyfikatorow do klientow
- send(newConnection1, (char*)&pakiet1, sizeof(pakiet1), NULL);
- send(newConnection2, pakiet2, sizeof(pakiet2), NULL);
- ///Odbieramy pakiety od klientow
- recv(newConnection1, (char*)&pakiet1, sizeof(pakiet1), NULL);
- recv(newConnection2, pakiet2, sizeof(pakiet2), NULL);
- odpakowanie(pakiet1, OPERA, OD1, OD2, ID);
- odpakowanie(pakiet2, OPERA, OD1, OD2, ID);
- /////////odpakowanie wiadomosci >> liczby L1 i L2
- int L1;
- int L2;
- int max = L1 + L2;
- int min;
- if (L1 > L2) {
- min = L1 - L2;
- }
- else {
- min = L2 - L1;
- }
- int L3 = rand() % (max - min) + min;
- //odpowiednie ustawienie OPERA, OD1, OD2, ID
- pakowanie(pakiet1, OPERA, OD1, OD2, ID);////////pakujemy liczby z przedzialami, dwa osobne czy jeden?
- //odpowiednie ustawienie OPERA, OD1, OD2, ID
- pakowanie(pakiet2, OPERA, OD1, OD2, ID);
- send(newConnection1, (char*)&pakiet1, sizeof(pakiet1), NULL);
- send(newConnection2, pakiet2, sizeof(pakiet2), NULL);
- ///////////odbieramy zgadywane wartosci az ktorys trafi
- boolean traf = 0;
- while (traf == 0) {
- recv(newConnection1, (char*)&pakiet1, sizeof(pakiet1), NULL);
- odpakowanie(pakiet1, OPERA, OD1, OD2, ID);
- //odpowiednie wykorzystanie zawartości OPERA, OD1, OD2, ID
- recv(newConnection2, pakiet2, sizeof(pakiet2), NULL);
- odpakowanie(pakiet2, OPERA, OD1, OD2, ID);
- //odpowiednie wykorzystanie zawartości OPERA, OD1, OD2, ID
- if (L1 == L3 || L2 == L3) {
- traf = 1; ///jesli trafilismy 1
- //odpowiednie ustawienie wartości OPERA, OD1, OD2, ID
- pakowanie(pakiet1, OPERA, OD1, OD2, ID); ///pakujemy info o trafieniu
- //odpowiednie ustawienie wartości OPERA, OD1, OD2, ID
- pakowanie(pakiet2, OPERA, OD1, OD2, ID);
- send(newConnection1, pakiet1, sizeof(pakiet1), NULL);
- send(newConnection2, pakiet2, sizeof(pakiet2), NULL);
- } //// klienci zamykaja i jest koniec
- else { ///nie trafilismy
- //odpowiednie ustawienie wartości OPERA, OD1, OD2, ID
- pakowanie(pakiet1, OPERA, OD1, OD2, ID);////pakujemy info o nietrafieniu. Moze zapakowac tylko raz i potem tylko powtarzac?<- nie nie może, musi jakos zmienić info - ale tylko jeśli w końcu trafią
- //odpowiednie ustawienie wartości OPERA, OD1, OD2, ID
- pakowanie(pakiet2, OPERA, OD1, OD2, ID);
- send(newConnection1, pakiet1, sizeof(pakiet1), NULL);
- send(newConnection2, pakiet2, sizeof(pakiet2), NULL);
- }
- }
- /// shutdown(newConnection, 2);
- //// system("pause");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement