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
IRC
enC++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
(v4
ouv6
). - 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.cpp
NICK
: 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 deport
sur 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
IP
de l’Hôte :hostname -I
-
Afficher l’Adresse
IPv4
de 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’adresseIPv4
pour l’interfaceenp3s0f0
en format compact.awk '{print $4}'
: Sélectionne la colonne contenant l’adresseIP
avec le masque de sous-réseau.cut -d/ -f1
: Supprime le masque de sous-réseau pour ne garder que l’adresseIP
pure.
-
Extraction de l’Adresse
IP
Principale :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
ircserv
viaValgrind
:valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --track-fds=yes ./ircserv <port> <password>
-
Ouvrir le Fichier de Configuration d'
Irssi
avecVS Code
:code ~/.irssi/config
-
Pour Utiliser
RAWLOG
avec votre ServeurIRC
:Dans
irssi
:/RAWLOG OPEN ~/debug.log
-
Passer d'une conversation privée à la page d'accueil d'
Irssi
:-
Appuyez sur
Alt + 1
ouEsc
suivi de1
pour retourner à la fenêtre 1, qui est souvent la page d'accueil ou le canal principal. -
Appuyez sur
Alt + flèche gauche
ouAlt + flèche droite
pour naviguer entre les fenêtres. Vous pouvez également utiliserCtrl + P
(fenêtre précédente) ouCtrl + N
(fenêtre suivante). -
Tapez
/window goto 1
dans n'importe quelle fenêtre pour revenir à la fenêtre 1.
-
-
Adresse
IP
pour les transferts DCC-
Observation : Votre configuration indique
hostname = "127.0.0.1"
dans les paramètres du core. L'adresse127.0.0.1
est l'adresse de bouclage (localhost) et n'est pas accessible depuis d'autres machines sur le réseau. -
Solution : Définissez votre adresse
IP
externe ou locale correcte en utilisant la commande suivante dansIrssi
:/set dcc_own_ip votre.adresse.ip
Remplacez 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
netcat
en é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 à
Raf
et recevoir le fichier :nc <server_ip> 12345 > test.txt
<server_ip>
: AdresseIP
deRaf
.12345
:Port
fourni 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
PRIVMSG
dans 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.