Iut: Ragots & Commérages (IRC)
Présentation
Le but de ce TP est d'écrire un client et un serveur pseudo-IRC
en C++, en utilisant les sockets TCP et la librairie ncurses (et en
prévoyant une amélioration avec QT). Bien
entendu, vous n'allez pas implémenter un réel client IRC
(la norme de communication est décrite dans le RFC (Request For
comment) 1459 que vous pouvez trouver sur www.irchelp.org).
Une fenêtre du client IRC peut se diviser en trois parties: la
liste des messages reçus, une barre de status qui indique le
nickname et le dernier channel joint, une ligne de commande sur
laquelle on peut taper des messages, ou des commandes (toute commande
commence par un /).
Pour tester irc:
- Lancer le client irc en indiquant un surnom et un server: "irc
nickname hina"
- Attendre la barre de status (1 bonne minute)
- Se connecter a un channel: "/join #iut"
- Envoyer des messages que tous les gens sur ce channel verront:
"message spirituel et drôle"
- "/list" permet de lister les channels disponibles
- "/quit" permet de se déconnecter
- "/who *" permet d'avoir la liste des utilisateurs
connectés sur le channel.
- La première personne à rejoindre un channel le
crée. Il a alors les droits d'opérateur sur le channel.
Le channel est détruit quand plus personne n'y est
connecté.
- "/topic "bienvenue aux nouveau"" permet à
l'opérateur du channel de changer le topic du channel,
affiché à chaque connection.
- On peut joindre plusieurs channels en même temps. Les
messages sont envoyés au dernier channel joint.
Travail demandé
Vous allez écrire un prototype du client et du serveur IRC
implémentant uniquement les fonctionnalités essentielles.
Vous êtes maître du protocole de communication entre le
serveur et le client et n'avez pas à suivre les recommendations
du RFC. Vous devrez écrire votre programme en C++, en utilisant
les outils disponibles dans la norme ANSI (en particulier la STL).
Les fonctions d'entrée/sortie de C++ ne suffiront pas à
implémenter l'interface texte.
Vous utiliserez donc la librairie ncurses
ou une bibliothèque graphique (QT). ncurses est la librairie de
référence pour les entrées/sorties pour terminal
sous Unix. Elle est écrite en C et de nombreux programme en font
un usage intensif (elle est très complète). Pensez
à inclure ncurses.h et à linker avec la librairie
ncurses. Pensez aussi à consulter le man des fonctions ncurses.
Conception
Avant de taper une seule ligne de code, ayez une idée
précise des besoins du logiciel, un diagramme UML de vos classes
et un schéma présentant le fonctionnement de vos
programme (bientôt vous aurez des diagrammes de collaboration).
Le succès de la programmation dépend de la qualité
de l'analyse.
A propos de ncurses
Pour vous éviter de perdre trop de temps:
- Initialsez avec initscr()
- endwin() restaure l'état du terminal en sortant
- Le coin en haut est gauche est de coordonnées (0,0)
- Le coin en bas à droite est de coordonnées
(COLS-1,LINES-1)
- int move(int y, int x); déplace le curseur
- Les fonctions de type printf doivent être
remplacées par des fonctions de type printw
- int mvprintw(int y, int x, char *fmt [, arg] ...);
permet d'afficher à une position donnée
- ncurses est multi-fenêtré (en mode texte). Si l'on
ne précise rien, on travaille sur la fenêtre par
défaut (stdscreen). Les fenêtre vous seront utiles, voire
indispensables. Ecrire dans une fenêtre ne change pas directement
l'écran (pour des raisons d'efficacité), il faut appeler wrefresh().
- WINDOW *newwin(int nlines, int ncols, int begin_y, int
begin_x); crée une fenètre (paramètres:
dimension et position).
- int delwin(WINDOW *win); libère une
fenêtre.
- int scroll(WINDOW *win); et int wscrl(WINDOW *win,
int n); permettent de scroller une fenêtre.
- La fonction de scroll ne fonctionne que si le scroll a
été autorisé sur la fenêtre: scrollok(m,TRUE);
- Les fonctions avec un 'w' en début de nom
s'addressent à une fenêtre en particulier (exemple "wprintw(statusBar,"nickname
channe")" marche comme un printw)
- Un printw scroll tout seul si le scroll
estautorisé pour le fenètre.
- getyx(WINDOW *win, int y, int x); permet de
récupérer la position du curseur dans une fenêtre.
Je vous donne aussi un programme qui
présente rapidement ce dont vous devriez avoir besoin en
matière de curses. Je rajoute aussi un programming howto
trouvé sur le net. Au travail!