Files
C-IPC/PROTOCOL.md
T
2026-01-26 23:55:41 +01:00

2.2 KiB

Protokół Komunikacyjny IPC

Struktura Wiadomości

Wszystkie komunikaty opierają się na strukturze msgbuf_t zdefiniowanej w pliku commands.h.

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

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;