Le problème
Servir plusieurs opérateurs sans mélanger leur session
Chaque client possède son propre état de connexion, d’authentification et de streaming, tandis que le mode mission et les compteurs de supervision sont partagés. Le serveur doit donc séparer clairement l’état local d’une session et l’état global, puis arrêter proprement tous les threads.
Le protocole reste volontairement lisible dans un terminal, mais le parser et le processeur sont indépendants du réseau : les règles métier peuvent être testées sans ouvrir de socket.
Architecture
Réseau à l’extérieur, règles de commande au centre
TCP
session jthread
CommandProcessor
HTTP monitor
Les descripteurs sont encapsulés dans `UniqueFd`. Les threads utilisent `std::jthread` et des stop tokens pour éviter les cycles de vie implicites. `ServerState` concentre les compteurs atomiques et protège les données composites par mutex.
Décisions d’ingénierie
Un petit serveur pensé pour être repris
Parser sans dépendance réseau
Une ligne devient une commande typée ; le processeur retourne une réponse sérialisable et modifie un contexte explicite.
RAII pour les sockets
Le descripteur est fermé automatiquement et ne peut pas être copié par erreur.
État partagé minimal
Les compteurs simples sont atomiques ; le mode et les agrégats nécessitant cohérence sont synchronisés.
Deux niveaux de supervision
Logs structurés pour le diagnostic et `/status` JSON pour une intégration avec un outil externe.
Démonstration réelle
Validation du protocole et de la machine d’état
La capture montre la suite de tests compilée et exécutée : commandes valides/invalides, sérialisation, règles `CONNECT`/`AUTH`, changement de mode, streaming et état serveur.
./mcps_server --port 5555 --token mission-secret --monitor-port 8080
./mcps_client --command "SET_MODE ACTIVE"Preuves techniques
Ce que le dépôt permet de vérifier
- Commandes `CONNECT`, `AUTH`, `GET_STATUS`, `START_STREAM`, `SET_MODE`, `PING`, `HELP` et `QUIT` documentées.
- Tests négatifs sur les commandes invalides et l’accès privilégié avant authentification.
- Arrêt propre sur `SIGINT`/`SIGTERM` et ownership explicite des sockets.
- Modèle de sécurité borné et documenté : le token de simulation n’est pas présenté comme suffisant sur un réseau non fiable.