FT_IRC
Construire un serveur IRC en C++98, capable de gérer plusieurs clients en parallÚle et d'interpréter les commandes du protocole IRC (RFC 1459/2812). Ce to-do couvre exclusivement la partie serveur, rien de plus.
Lâobjectif ici est de mettre en place un socket TCP non bloquant qui Ă©coute les connexions entrantes.
-
Inclure les bons headers
- inclure ceux qui permettent dâutiliser
socket(),bind(),listen(),accept(),poll(),fcntl(), etc. - Exemples :
<sys/socket.h>,<netinet/in.h>,<fcntl.h>,<unistd.h>, etc.
- inclure ceux qui permettent dâutiliser
-
Créer le socket serveur
- Utilise
socket(AF_INET, SOCK_STREAM, 0) - Vérifie que le
fdretournĂ© est valide (â -1)
- Utilise
-
Rendre l'adresse réutilisable
- Avec
setsockopt()et lâoptionSO_REUSEADDR, pour Ă©viter les erreurs du type "address already in use"
- Avec
-
Rendre le socket non-bloquant
- GrĂące Ă
fcntl(), pour que ton serveur puisse gĂ©rer plusieurs clients sans ĂȘtre bloquĂ© par un seul
- GrĂące Ă
-
Remplir la structure d'adresse
sockaddr_in- Spécifie : IPv4 (
AF_INET), IP (INADDR_ANY), port (utilisehtons(port))
- Spécifie : IPv4 (
-
Lier le socket avec
bind()- Lie le socket Ă lâadresse IP + port
- VĂ©rifie les retours dâerreurs
-
Mettre en écoute avec
listen()- Commence à écouter les connexions entrantes (backlog =
SOMAXCONNpar exemple)
- Commence à écouter les connexions entrantes (backlog =
-
Afficher un message pour confirmer que le serveur est prĂȘt
- Par exemple : "Serveur en écoute sur le port 6667..."
Lâobjectif est de gĂ©rer plusieurs connexions client en parallĂšle grĂące Ă une boucle non-bloquante avec
poll().
-
Initialiser une structure
pollfd[]- Mets le socket serveur dedans, avec lâĂ©vĂ©nement
POLLIN
- Mets le socket serveur dedans, avec lâĂ©vĂ©nement
-
Créer une boucle principale
- Appelle
poll()sur le tableau depollfd - Vérifie le retour de
poll()pour détecter une activité
- Appelle
-
Accepter une nouvelle connexion si
POLLINsur le socket serveur- Utilise
accept() - Rends la nouvelle socket client non bloquante
- Ajoute-la dans le tableau
pollfd
- Utilise
-
Afficher un message quand un client se connecte
- Tu peux afficher son IP + port
-
Lire les messages entrants (
recv())- Si
recv()retourne 0 ou -1, déconnecter le client - Sinon, stocker ou afficher le message
- Si
-
Gérer la déconnexion propre
- Fermer le socket du client et le retirer du tableau
pollfd
- Fermer le socket du client et le retirer du tableau
Commence Ă organiser ton code avec des classes C++ propres.
-
Créer une classe
Server- Membres : port, socket serveur, tableau/listes de clients, etc.
- Méthodes :
start(),acceptClient(),handlePoll(), etc.
-
Créer une classe
Client- Membres : fd, pseudo (
nick), username, buffer, etc. - Identifier les clients par leur
fd
- Membres : fd, pseudo (
-
Stocker les clients dans une structure
- Par exemple : tableau statique, map
fd â Client, etc.
- Par exemple : tableau statique, map
Commence Ă traiter les vraies commandes du protocole RFC IRC (1459/2812).
-
Lire les messages complets (finis par
\r\n)- Traiter les lignes complÚtes reçues
-
Gérer la commande
PASS- Refuser toute commande tant que le mot de passe nâa pas Ă©tĂ© validĂ©
-
Gérer
NICK- Vérifier unicité du pseudo
- Mettre Ă jour le client
-
Gérer
USER- Stocker les infos de lâutilisateur
-
Envoyer le message de bienvenue (code
001)- Quand le client a envoyé
PASS,NICKetUSER
- Quand le client a envoyé
-
Implémenter
PING/PONG- Pour maintenir la connexion active
-
Gérer les erreurs standard
- Mauvaise syntaxe, nickname en double, commande inconnue, etc.
Mise en place des interactions entre clients et canaux.
-
Gérer
JOIN- CrĂ©er un canal sâil nâexiste pas
- Ajouter le client Ă la liste des membres
-
Gérer
PRIVMSG- Envoi dâun message Ă un canal (tous les membres sauf lâĂ©metteur)
- Envoi dâun message privĂ© Ă un autre utilisateur
-
Gérer
PART- Quitter un canal
-
Gérer
QUIT- Déconnexion manuelle
-
(Optionnel) Ajouter
NOTICE,TOPIC,MODE, etc.
Une fois les fonctionnalités implémentées, il faut tout tester.
-
Tester avec
telnetounetcat- Exemple :
telnet localhost 6667
- Exemple :
-
Tester avec un client IRC comme HexChat
- Vérifie que le client arrive à se connecter, envoyer des messages, etc.
-
Vérifier les erreurs courantes
- Pseudo dĂ©jĂ utilisĂ©, message sans ĂȘtre connectĂ©, commande inconnue...
-
Gérer les déconnexions correctes
- Retirer le client de tous les canaux
- Libérer ses ressources
-
Vérifier les fuites mémoire avec valgrind
- TrĂšs important pour la soutenance
- C++98 uniquement (pas de
auto,nullptr,std::vectorsi pas autorisé, etc.) - Aucun appel bloquant (
accept(),recv(), etc. doivent ĂȘtre non-bloquants) - Gestion robuste des erreurs systĂšme
- Code structuré, clair, séparé par fichiers/classes
- Comportement conforme Ă la RFC IRC
Ce to-do couvre tout ce qui est nécessaire pour implémenter le serveur IRC demandé dans le sujet ft_irc.
Il ne contient aucune fonctionnalitĂ© bonus ou non demandĂ©e (comme lâinterface client, TLS, rĂ©seaux de serveurs, etc.).
- â Structure de classe Bot avec intĂ©gration IRC basique
- â Parsing des commandes bot (CONNECT4, PLAY)
- â Stockage de parties basique avec std::map
- â Communication serveur via sendToChannel()
- â Initialisation plateau 6x7
- â Placement de piĂšces avec simulation de gravitĂ©
- â DĂ©tection de victoire (horizontal, vertical, diagonal)
- â Gestion d'Ă©tat de jeu basique
- â Affichage du plateau dans le canal IRC
- â SĂ©lection alĂ©atoire de coups parmi les colonnes valides
- â Validation basique des colonnes
- â Alternance des tours entre humain et bot
- â DĂ©marrer partie avec commande "CONNECT4" (bot seulement)
- â Jouer coups avec commande "PLAY "
- â DĂ©tection basique victoire/dĂ©faite et nettoyage
- â Gestion des tours
- Implémenter détection de coup gagnant
- Ajouter blocage des coups gagnants adverses
- Meilleur positionnement stratégique
- Niveaux de difficulté
- SystÚme de défi avec "CONNECT4 "
- Accepter défis avec commande "ACCEPT"
- Ătat de jeu appropriĂ© : WAITING_FOR_ACCEPT
- Timeouts des défis
- Détection d'égalité quand plateau plein
- Fonctionnalité d'abandon
- Statistiques et comptage des coups
- Plusieurs parties simultanées par canal
- Suivi d'activité avec timestamps
- Nettoyage automatique aprÚs inactivité
- Expiration des défis (2 min)
- Timeout de partie (5 min)
- Meilleure validation des entrées
- Vérification d'appartenance au canal
- EmpĂȘcher plusieurs parties par joueur
- Gestion gracieuse des déconnexions
- Support messages privés pour bot
- Replay/historique des parties
- Mode spectateur
- Tournois à élimination
- Diviser Bot.cpp en fichiers plus petits
- Ajouter codes d'erreur/enum appropriés
- Meilleure const correctness
- Ajouter tests unitaires
- Optimiser algorithme de détection de victoire
- Meilleure gestion mémoire pour nombreuses parties
- Optimisations de pool de connexions
- Ajouter documentation des fonctions
- Compléter exemples README
- Ajouter guides de débogage
- Pas de dĂ©tection d'Ă©galitĂ© - les parties continuent mĂȘme quand le plateau est plein
- Pas d'implémentation de commande d'abandon
- Limité aux parties contre bot seulement (pas de JcJ)
- Pas de gestion des timeouts
- Messages d'erreur basiques seulement
- Pas de statistiques de parties persistantes
- Architecture bot basique implémentée
- Logique Connect4 fonctionnelle
- IA simple avec coups aléatoires
- Intégration IRC fonctionnelle
- Parties bot vs humain fonctionnelles
- Détection de victoire implémentée
- Affichage du plateau fonctionnel
Prochaine priorité : Implémenter détection d'égalité et améliorer stratégie IA
Bonne construction ! Tu peux cocher chaque Ă©tape Ă mesure que tu avances. đ»