65 lines
2.2 KiB
Markdown
65 lines
2.2 KiB
Markdown
# 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;
|
|
```
|