Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Latest commit

 

History

History

cw10

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Sockety

Celem zadania jest napisanie prostego systemu pozwalającego na granie w kółko i krzyżyk w architekturze klient/serwer.

Serwer nasłuchuje jednocześnie na gnieździe sieciowym i gnieździe lokalnym.
Klienci po uruchomieniu przesyłają do serwera swoją nazwę, a ten sprawdza czy klient o takiej nazwie już istnieje - jeśli tak, to odsyła klientowi komunikat że nazwa jest już w użyciu; jeśli nie, to zapamiętuje klienta.
Serwer ma za zadanie łączyć klientów w pary - w przypadku pierwszego klienta wysyła mu informacje o tym, że oczekuje na drugiego klienta. Gdy drugi klient dołączy się do serwera informuje ich o połączeniu w parę, losuje zaczynającego gracza i wysyła do nich pustą planszę wraz z informacją o przydzielonym znaku (X/O).
Klienci następnie na zmianę wykonują ruchy aż do wygranej lub remisu - wybór pól może być wykonany poprzez ich numeracje (1-9). Wiadomości o ruchach powinny być wysyłane do serwera, który je przekaże drugiemu klientowi. Po zakończonej rozgrywce klient powinien wyrejestrować się z serwera.

Serwer przyjmuje jako swoje argumenty:

  • numer portu TCP/UDP (zależnie od zadania)
  • ścieżkę gniazda UNIX

Wątek obsługujący sieć powinien obsługiwać gniazdo sieciowe i gniazdo lokalne jednocześnie, wykorzystując w tym celu funkcje do monitorowania wielu deskryptorów (epoll/poll/select).
Dodatkowo, osobny wątek powinien cyklicznie "pingować" zarejestrowanych klientów, aby zweryfikować że wciąż odpowiadają na żądania i jeśli nie - usuwać ich z listy klientów.
Można przyjąć, że ilość klientów zarejestrowanych na serwerze jest ograniczona do maksymalnie kilkunastu.

Klient przyjmuje jako swoje argumenty:

  • swoją nazwę (string o z góry ograniczonej długości)
  • sposób połączenia z serwerem (sieć lub komunikacja lokalna przez gniazda UNIX)
  • adres serwera (adres IPv4 i numer portu lub ścieżkę do gniazda UNIX serwera)

Klient przy wyłączeniu Ctrl+C powinien wyrejestrować się z serwera.

Zadanie 1 (50%)
Komunikacja klientów i serwera odbywa się z użyciem protokołu strumieniowego.

Zadanie 2 (50%)
Komunikacja klientów i serwera odbywa się z użyciem protokołu datagramowego.