# Protokół Komunikacyjny IPC ## Struktura Wiadomości Wszystkie komunikaty opierają się na strukturze `msgbuf_t` zdefiniowanej w pliku `commands.h`. ```c typedef struct msgbuf { long mtype; // Typ wiadomości (Komenda) int stype; // Podtyp / Status char sender[16]; // ID/Nick nadawcy char command[16]; // ID celu, nazwa grupy lub inny argument char message[256]; // Treść wiadomości } msgbuf_t; ``` z ### Pola * **mtype**: Enum określający główną akcję * **stype**: Używany do kodów statusu lub podkomend * **sender**: Unikalny identyfikator klienta inicjującego żądanie. * **command**: Metadane zależne od kontekstu (np. użytkownik docelowy dla wiadomości prywatnej, nazwa grupy dla żądania dołączenia). * **message**: Właściwa treść wiadomości czatu lub powiadomienia systemowego. ## Przebieg Połączenia ### 1. Nawiązywanie Połączenia i Logowanie 1. **Inicjalizacja Serwera**: Serwer tworzy publiczną kolejkę komunikatów i zapisuje jej ID do znanego pliku (domyślnie `server_queue_id` w katalogu roboczym). 2. **Inicjalizacja Klienta**: Klient odczytuje ID kolejki serwera i tworzy własną, prywatną kolejkę komunikatów. 3. **Żądanie Logowania**: * Klient wysyła wiadomość `Login` na publiczną kolejkę serwera. * Treść zawiera ID Klienta oraz ID prywatnej kolejki Klienta. 4. **Walidacja**: * Serwer sprawdza na danych wczytanych z pliku konfiguracyjnego, czy podane ID Klienta istnieje. * Serwer wysyła odpowiedź na prywatną kolejkę Klienta (Sukces lub Błąd). ## Komendy oraz sygnały ```c typedef enum { Message = 1, Login, Logout, Hearbeat, List, JoinGroup, LeaveGroup, Mute, Unmute, Signal, Inbox } Command_t; typedef enum { ACK_ACCEPTED = 0, ACK_DELIVERED, ERR_UNKNOWN_COMMAND, // Błąd niepoprawnej komendy ERR_NOT_LOGGED_IN, // Błąd odmowy bez zalogowania ERR_ALREADY_LOGGED_IN, // Błąd logowania dla przy logoowaniu zalogowanego już użytkownika ERR_ALREADY_IN_GROUP, ERR_NOT_FOUND, // Błąd ogólny zwracany przy nieznalezieniu użytkownika/grupy ERR_ALREADY_MUTED, ERR_INVALID_FORMAT } Signal_t; ```