Данный проект разрабатывался с использованием CMake под WSL2 (Ubuntu). Он использует пакетный менеджер conan.
Поэтому для установки пакетов следует выполнить готовый скрипт install_pkg.sh
:
$ ./install_pkg.sh
Vasiliy Nesterovich
Vasiliy Nesterovich
- Хранить даннные решено в JSON — для простоты и большей переносимости. С этой целью установлена библиотека nlohmann/json.
- Пароли, разумеется, лучше хешировать. Используется bcrypt из Botan.
Модели: User. Описывает пользователей.
Сервисы: ConnectionService, UserService. Первый отвечает за сетевую работу, второй — за хранение пользователей.
Методы ConnectionService
// Создать сокет и ожидать подключения (адрес и порт заданы в препроцессоре).
void connect();
// Принять входящее подключение.
int accept_client();
// Отправить клиенту сообщение произвольного типа.
template<typename T>
void send_message(int client_socket, T value);
// Отправить клиенту строку.
void send_message_string(int client_socket, const string &str);
// Получить от клиента сообщение произвольного типа.
template<typename T>
T receive_message(int client_socket);
// Получить от клиента строку.
string receive_message_string(int client_socket);
// Закрыть соединение с клиентом.
void close_client(int client_socket);
// Закрыть сокет.
void shutdown();
Методы UserService
// Аналогично предыдущему сервису.
void initialize();
// Создать нового пользователя (записать в файл).
User add_user(User &user);
// Получить объект пользователя по логину.
User get_user(string &login);
// Получить набор всех пользователей системы.
vector<User> get_users();
// Проверить, есть ли в системе пользователь с данным логином.
bool find_user(string &login);
Контроллеры: весь функционал данного чата управляется ChatController.
Методы ChatController
// Открыть сокет и начать принимать подключения.
void initialize();
// Начать обслуживать входящие подключения.
void accept_connections();
// Обработать подключившегося клиента.
void handle_client(int client_socket, uint32_t id);
// Выполнить регистрацию клиента.
void do_signup(uint32_t id);
// Выполнить вход клиента.
void do_login(uint32_t id);
// Отключить клиента.
void do_disconnect(uint32_t id);
// Ожидать очередное сообщение от клиента и затем обработать его.
void expect_message(uint32_t id);
// Обработать личное сообщение от одного клиента к другому.
void do_personal_message(uint32_t id, const string &message);
// Послать обработанное личное сообщение.
void send_message(uint32_t id, uint32_t to_id, const string &message);
// Послать сообщение в общий чат.
void broadcast_message(uint32_t id, const string &message);
// Послать уведомление всем клиентам.
void broadcast_alert(const string &text);
// Сгенерировать хэш пароля.
static string gen_password(const string &password);
// Остановить сервер.
void do_stop();
Всё сделано в одиночку