IRC
Un projet d’école 42 consistant à développer un serveur IRC (Internet Relay Chat) minimaliste en C++. L’objectif est de comprendre le modèle client-serveur, la gestion des sockets et la communication en réseau.
Un projet d’école 42 consistant à développer un serveur IRC (Internet Relay Chat) minimaliste en C++. L’objectif est de comprendre le modèle client-serveur, la gestion des sockets et la communication en réseau.
Un projet d’école 42 consistant à développer un serveur IRC (Internet Relay Chat) minimaliste en C++.
L’objectif est de comprendre le modèle client-serveur, la gestion des sockets et la communication en réseau.
Le serveur ft_irc
implémente un sous-ensemble du protocole IRC :
gestion des connexions, échange de messages, canaux et pseudonymes.
Chaque client se connecte au serveur, rejoint des salons et envoie/reçoit des messages en temps réel.
Un socket est un point de communication bidirectionnel entre deux machines sur un réseau, identifié par une paire (adresse IP : port)
.
On peut le comparer à un appel téléphonique : le serveur « écoute » sur un numéro, le client « compose » ce numéro pour établir la connexion.
192.168.0.42
) ou IPv6 int sock_listen = socket(AF_INET, SOCK_STREAM, 0);
if (sock_listen < 0) {
std::cerr << "Erreur : échec de la création du socket\n";
return EXIT_FAILURE;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080); // port d’écoute
inet_pton(AF_INET, "0.0.0.0", &addr.sin_addr); // toutes interfaces
if (bind(sock_listen, (sockaddr*)&addr, sizeof(addr)) < 0) {
std::cerr << "Erreur : échec du bind\n";
return EXIT_FAILURE;
}
Permet de « raccrocher » l’adresse IP/port au socket.
if (listen(sock_listen, SOMAXCONN) < 0) {
std::cerr << "Erreur : échec de l’écoute\n";
return EXIT_FAILURE;
}
sockaddr_in client_addr;
socklen_t len = sizeof(client_addr);
int sock_client = accept(sock_listen,
(sockaddr*)&client_addr,
&len);
if (sock_client < 0) {
std::cerr << "Erreur : échec de l’accept\n";
return EXIT_FAILURE;
}
Chaque client obtient un nouveau socket (sock_client) pour la session.
char buffer[4096];
int bytes;
while ((bytes = recv(sock_client, buffer, sizeof(buffer), 0)) > 0) {
// Traitement du message reçu
std::string msg(buffer, bytes);
std::cout << "Reçu : " << msg << "\n";
// Echo en réponse
send(sock_client, buffer, bytes, 0);
}
if (bytes == 0)
std::cout << "Client déconnecté\n";
else
std::cerr << "Erreur recv\n";
close(sock_client);
close(sock_listen);
std::cout << "Serveur arrêté\n";
<!-- divider --!>
/!\ Ici dans cette implementation ne gere que un seul client à la fois.
Normalement on utilise un select() ou un epoll() pour gérer plusieurs clients simultanément.
Bon courage pour la suite !