Мне таки удалось реализовать базовый функционал кроссплатформенного многопоточного сервера. Там еще конечно есть что дорабатывать, но это уже близко к тому что я хотел добиться. Что умеет на данный момент:
- Просмотр текущих настроек
- Просмотр текущих подключенных клиентов
- Запуск сервера в отдельном потоке (если уже запущен то выдаст сообщение что уже запущен)
- Остановка потока сервера (если не запущен то выдаст сообщение что не запущен)
- Просмотр логов
- Вывод текущего состояния сервера (выключен/запущен)
Под капотом: основной интерес представляет класс menu и net. Класс menu имеет встроенную структуру server, членами которой являются экземпляр класса net и фьючерс в котором будет вызываться запуск сервера. Класс net. Тут используется структура netObj, в которой хранятся сокеты, экземпляр структуры sockaddr_in, идентификатор клиента, индивидуальный пакет для передачи данных, и фьючерс в котором будет запущен поток. Для экземпляра servObj структуры netObj в фьючерсе запускаем поток контролирующий потоки соединений. При запуске сервера и подключении клиента в вектор указателей (на netObj) cliObj помещается указатель на структуру клиента, в ней инициализируется фьючерс в котором запускается поток работы с клиентом. Также все сообщения отправляются в отдельном потоке в Logger.
update 21.04.2024:
- Изменения в CMakeLists, теперь приложение разделено на shared library's и executable binary
- Добавлен класс ReqAPI который будет использоваться для обработки запросов от клиента.
update 20.04.2024:
- Исправлены названия классов
- Добавлена небольшая задержка опроса в netManager. Изза её отсутствия система могла "вешать" поток в котором он работает.
- Добавлена возможность изменения настроек сервера из приложения. На данный момент часть настроек не обрасла необходимыми проверками веденных данных, поэтому пока только менять можно порт и количество клиентов.
- Реализация шаблонной функции проверки выбора в меню.