Documentation
This commit is contained in:
+64
@@ -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;
|
||||||
|
```
|
||||||
@@ -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.
|
||||||
@@ -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");
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user