Le projet ft_irc consiste à développer un serveur IRC en respectant le standard IRC tout en utilisant le langage C++98. Le serveur doit gérer plusieurs connexions simultanées et fonctionner en mode non bloquant pour permettre une communication fluide entre les clients.
Vous devez tester votre serveur à l'aide d'un vrai client IRC pour garantir la compatibilité avec le protocole standard.
- Reproduire le fonctionnement d'un serveur
IRCenC++98. - Gérer plusieurs clients simultanément sans blocage.
- Implémenter les principales commandes IRC comme
NICK,USER,JOIN,PRIVMSG, etc. - Fournir un système d'authentification via un mot de passe à la connexion.
- Supporter les opérateurs de canal et les commandes associées comme
KICK,INVITE,TOPIC, etMODE.
- Communication
TCP/IP: Utilisation des sockets pour la communication entre le serveur et les clients via le protocoleTCP/IP(v4ouv6). - Gestion des canaux : Le serveur doit permettre la création et la gestion de canaux
IRC, avec la possibilité d'envoyer des messages privés ou dans des canaux. - Non-bloquant : Toutes les opérations d'entrée/sortie (E/S) sont non bloquantes afin de ne jamais empêcher la gestion simultanée des connexions multiples.
- Sécurité : Utilisation d'un mot de passe pour sécuriser l'accès au serveur. Chaque client doit fournir le bon mot de passe pour pouvoir se connecter.
- Support multi-clients : Le serveur peut gérer plusieurs connexions simultanément sans aucun forking ou thread supplémentaire.
.
├── incs
│ ├── Bot.hpp
│ ├── Channel.hpp
│ ├── Client.hpp
│ ├── IrcMessageBuilder.hpp
│ ├── IrcNumericReplies.hpp
│ └── Server.hpp
├── Makefile
├── README.md
└── srcs
├── Bot.cpp
├── Channel.cpp
├── Client.cpp
├── IrcMessageBuilder.cpp
├── main.cpp
└── Server.cppNICK: Changer le pseudonyme du clientUSER: S'authentifier sur le serveurJOIN: Rejoindre un canalPRIVMSG: Envoyer un message privé ou un message dans un canalKICK: Éjecter un client d'un canal (opérateurs uniquement)INVITE: Inviter un client à rejoindre un canalTOPIC: Changer ou afficher le sujet d'un canalMODE: Modifier les permissions d'un canal (opérateurs uniquement)
- Bot IRC : Possibilité d'ajouter un petit bot qui interagit avec les utilisateurs.
- Transfert de fichiers : Support de l'envoi de fichiers entre clients.
Utilisez le Makefile pour compiler le projet avec les options de compilation requises. Le projet doit se compiler en utilisant C++98 avec les flags -Wall -Wextra -Werror.
Commandes disponibles :
make # Compile le projet
make clean # Supprime les fichiers objets
make fclean # Supprime les fichiers objets et les binaires
make re # Recompile le projet./ircserv <port> <password>- Arguments :
<port>: Le numéro deportsur lequel le serveur écoutera.<password>: Le mot de passe que les clients devront fournir pour se connecter.
Voici un aperçu de l'interface graphique du serveur ft_irc lors de son lancement :
-
Afficher les Adresses
IPde l’Hôte :hostname -I
-
Afficher l’Adresse
IPv4de l’Interfaceenp3s0f0:ip -o -4 addr show enp3s0f0 | awk '{print $4}' | cut -d/ -f1
Explication des Commandes :
ip -o -4 addr show enp3s0f0: Affiche les informations d’adresseIPv4pour l’interfaceenp3s0f0en format compact.awk '{print $4}': Sélectionne la colonne contenant l’adresseIPavec le masque de sous-réseau.cut -d/ -f1: Supprime le masque de sous-réseau pour ne garder que l’adresseIPpure.
-
Extraction de l’Adresse
IPPrincipale :hostname -I | awk '{print $1}'
Cette section décrit les différentes méthodes pour se connecter à un serveur IRC en fonction de l'outil utilisé.
Utilisez nc pour établir une connexion basique au serveur IRC. C'est utile pour des tests rapides :
nc <server_ip> <port>Envoi de commandes IRC : Une fois connecté, entrez vos commandes IRC directement dans le terminal (par exemple, PASS, NICK, USER, etc.).
-
Méthode A : Connexion simple Lancer
irssi:irssi
Une fois dans l'interface d'
irssi, utilisez la commande suivante :/connect <server_ip> <port> -
Méthode B : Connexion avec paramètres (
port,nickname,password)irssi -c <server_ip> -p <port> -n <nickname> -w <password>
Comparaison des outils :
nc (netcat) : Idéal pour des tests basiques et vérifier les échanges bruts avec le serveur.
irssi : Offre une interface interactive, utile pour tester des fonctionnalités avancées comme la gestion des canaux ou les commandes administratives.
- Vérification des Connexions Actives sur le Port
<port>aveclsof:lsof -i :<port>
- Forcer la Fermeture des Processus Actifs sur le Port
<port>:kill -9 $(lsof -t -i :<port>)
- Fuites Mémoire et Vérification des Descripteurs Actifs pour
ircservviaValgrind:valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --track-fds=yes ./ircserv <port> <password>
-
Ouvrir le Fichier de Configuration d'
IrssiavecVS Code:code ~/.irssi/config -
Pour Utiliser
RAWLOGavec votre ServeurIRC:Dans
irssi:/RAWLOG OPEN ~/debug.log -
Passer d'une conversation privée à la page d'accueil d'
Irssi:-
Appuyez sur
Alt + 1ouEscsuivi de1pour retourner à la fenêtre 1, qui est souvent la page d'accueil ou le canal principal. -
Appuyez sur
Alt + flèche gaucheouAlt + flèche droitepour naviguer entre les fenêtres. Vous pouvez également utiliserCtrl + P(fenêtre précédente) ouCtrl + N(fenêtre suivante). -
Tapez
/window goto 1dans n'importe quelle fenêtre pour revenir à la fenêtre 1.
-
-
Adresse
IPpour les transferts DCC-
Observation : Votre configuration indique
hostname = "127.0.0.1"dans les paramètres du core. L'adresse127.0.0.1est l'adresse de bouclage (localhost) et n'est pas accessible depuis d'autres machines sur le réseau. -
Solution : Définissez votre adresse
IPexterne ou locale correcte en utilisant la commande suivante dansIrssi:/set dcc_own_ip votre.adresse.ipRemplacez votre.adresse.ip par votre adresse IP réelle sur le réseau.
-
Résultat : Cette commande ajoutera automatiquement l'entrée suivante dans votre fichier de configuration
~/.irssi/config:"irc/dcc" = { dcc_own_ip = "<client_ip>"; }; };
-
-
Envoyer un Fichier avec
DCC:/dcc send Pol /mnt/nfs/homes/raveriss/Desktop/Sender/test.txt -
Recevoir un Fichier avec
DCC:/dcc get Raf test.txt
-
1. Sur le client expéditeur (
Raf) :Ouvrez un terminal et placez-vous dans le répertoire du fichier :
cd /mnt/nfs/homes/raveriss/Desktop/Sender/Lancez
netcaten écoute sur un port dédié, par exemple12345:nc -l 12345 < test.txt -
2. Sur le client récepteur (
Pol) :Lancez la commande suivante pour vous connecter à
Rafet recevoir le fichier :nc <server_ip> 12345 > test.txt
<server_ip>: AdresseIPdeRaf.12345:Portfourni parRaf.
- 1. Quand un client est dans un channel contenant plusieurs autres clients, faire un
Ctrl + Z.
Ce message devrait apparaitre :
[<n>]+ Stopped nc <server_ip> <port>Cela signifie que ce client est maintenant suspendu.
- 2. Envoyez maintenant plusieurs
PRIVMSGdans le channel avec plusieurs clients qui y sont presents. - 3. Effectuez la commande suivante avec le client suspendu :
fg % <n>Remplacez <n> par le numéro affiché entre crochets dans le message Stopped.
Si votre projet IRC fonctionne correctement, apres cette commande les messages ecrits pendant qu'il etait suspendu devraient apparaitre dans le terminal.

