Во-первых, он многопоточный.
Есть 2 основых потока:
1) Управляющий поток
Принимает команды от администратора сервера.
Команды:
- убить сервер
- отановить / возобновить сервер (после остановки есть возможность принять ещё одно подлючение, потому что поток, отвечающий за это всегда висит на accept)
- показать лог-файл
- очистить лог-файл (если сделать это во время работы, то пользователей в текущем сеансе не выкенет и их имена сохранятся в оперативке, но при следующем подключении сервер их не узнает)
2) Поток приёма новых подключений (фукнция main в классе сервера)
Говорит сам за себя, в принципе. Он постоянно ждёт на accept новых клиентов и при новом подключении создаёт свой поток для каждого.
При подключении авторизируется. Если его ip нет в лог-файле, то будет предложено выбрать имя (два одинаковых имени не может существоавать, потому как сервер широковещательный — это обработано). В лог зависываются адреса и имена.
Сервер работает с двумя списками — log_list и curr_list. В первом хранится состояние лог файла на текущий момент, а второй содержит перечень подключённых клиентов и сокет для связи с ними.