Documentation

This commit is contained in:
2026-01-26 23:55:41 +01:00
parent 20df30ace8
commit 2576a50108
4 changed files with 128 additions and 2 deletions
+64
View File
@@ -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;
```
+62
View File
@@ -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 <id_klienta>
```
- `<id_klienta>`: 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 <nick> <wiadomość>`: Wyślij wiadomość bezpośrednią do użytkownika
- `/msg #<grupa> <wiadomość>`: Wyślij wiadomość do grupy
- `/join <grupa>`: Dołączenie do określonej grupy
- `/leave <grupa>`: 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 <nick|#grupa>`: Wyciszenie użytkownika/grupy
- `/unmute <nick|#grupa>`: 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.
+1 -1
View File
@@ -197,7 +197,7 @@ int main(int argc, char *argv[]) {
} }
int server_queue_id = -1; 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); int fd = open(id_path, O_RDONLY);
if (fd == -1) { if (fd == -1) {
perror("Failed to open server queue id file"); perror("Failed to open server queue id file");
+1 -1
View File
@@ -138,7 +138,7 @@ int main(int argc, char **argv) {
return 1; 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) { if (!id_file_handle) {
perror("Failed to open file"); perror("Failed to open file");
return 1; return 1;