diff --git a/PROTOCOL.md b/PROTOCOL.md new file mode 100644 index 0000000..183df0a --- /dev/null +++ b/PROTOCOL.md @@ -0,0 +1,64 @@ +# 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; +``` diff --git a/README.md b/README.md new file mode 100644 index 0000000..fa34c1f --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# Czat IPC + +Aplikacja czatu klient-serwer zaimplementowana w języku C z wykorzystaniem mechanizmów IPC. System obsługuje wiadomości bezpośrednie, czaty grupowe, wiadomości offline oraz zarządzanie użytkownikami. + +## Kompilacja + +Projekt wykorzystuje biblioteke `libconfig` do przetwarzania danych konfiguracyjnych serwera. + +- Instalacja na Debian/Ubuntu: `sudo apt-get install libconfig-dev` +- Instalacja na Fedora: `sudo dnf install libconfig-devel` + +Projekt wykorzystuje standardowy plik `Makefile`. Aby skompilować serwer i klienta: + +```bash +make all +``` + +Skompilowane progarmy będą znajdować się w folderze `./build` + +## Użycie + +### 1. Serwer + +Do uruchomienia serwera, wymagany jest plik konfiguracyjny. Jeżeli nie podano ścieżki do pliku, serwer spróbuje wczytać scieżke `./example.conf` + +```bash +./build/server [plik_konfiguracyjny] +``` + +### 2. Klient + +Klient łączy się z serwerem używając `id_klienta` zdefiniowanego w konfiguracji. + +```bash +./build/client +``` + +- ``: Musi pasować do pola `id` zdefiniowanego na liście `clients` w pliku konfiguracyjnym (np. "test1", "test2"). + +## Komendy Klienta + +Po uruchomieniu klienta dostępne są następujące komendy: + +- `/msg `: Wyślij wiadomość bezpośrednią do użytkownika +- `/msg # `: Wyślij wiadomość do grupy +- `/join `: Dołączenie do określonej grupy +- `/leave `: Opuszczenie danej grupy +- `/list active`: Wyświetla listę aktualnie połączonych użytkowników. +- `/list all`: Wyświetla listę wszystkich użytkowników +- `/list groups`: Wyświetla listę dostępnych grup +- `/inbox`: Pobranie wiadomości offline +- `/mute `: Wyciszenie użytkownika/grupy +- `/unmute `: Odciszenie użytkownika/grupy +- `/quit`, `/exit`, `/q`: Wylogowanie i wyjście z programu + +## Struktura Projektu + +- **`server.c`**: Program serwera +- **`client.c`**: Program klienta +- **`util/`**: Funkcje pomocnicze i moduł ładowania konfiguracji. +- **`commands.h`**: Współdzielone definicje struktur protokołu i stałych. +- **`example.conf`**: Przykładowy plik konfiguracyjny dla użytkowników i grup. diff --git a/client.c b/client.c index a88d035..f6420c2 100644 --- a/client.c +++ b/client.c @@ -197,7 +197,7 @@ int main(int argc, char *argv[]) { } int server_queue_id = -1; - const char *id_path = "/home/piotr/server_queue_id"; + const char *id_path = "server_queue_id"; int fd = open(id_path, O_RDONLY); if (fd == -1) { perror("Failed to open server queue id file"); diff --git a/server.c b/server.c index 4bfce1e..d5fe401 100644 --- a/server.c +++ b/server.c @@ -138,7 +138,7 @@ int main(int argc, char **argv) { return 1; } - int id_file_handle = open("/home/piotr/server_queue_id", O_WRONLY | O_CREAT | O_TRUNC, 0666); + int id_file_handle = open("server_queue_id", O_WRONLY | O_CREAT | O_TRUNC, 0666); if (!id_file_handle) { perror("Failed to open file"); return 1;