Client/serveur, sockets

Transcription

Client/serveur, sockets
TD de Réseaux
François Cayre /[email protected]
Client/serveur, sockets
Notions abordées : serveur, client, sockets.
Fonctions POSIX associées : socket, bind, listen, FD_ZERO/FD_SET/accept, accept, recv, send, ntohs, gethostname, getaddrinfo, freeaddrinfo. 1 But du TD
Le but de ce TD est de réaliser un serveur TCP d'heure et de date. Ce prétexte
fallacieux sera mis à profit pour coder un embryon de protocole de haut niveau
et donner les fondements de développement réseau en utilisant les fonctions
POSIX.
2 Protocole et client
Le protocole que nous utiliserons est simpliste, il ne comprend que trois
commandes :
●
date : renvoie la date
●
time : renvoie l'heure
●
exit : déconnexion du serveur
Ces commandes ne prennent pas d'arguments, bien que la structure du code
permette d'en rajouter facilement.
Pour commencer, on utilisera le programme telnet1 pour simuler le client du
serveur, qui tourne sur le port numéro 1234. On donne ci-après un exemple de
session (en rouge, ce qui est entré par l'utilisateur, et en bleu, les réponses du
serveur) :
cayre@yiking:~/ens/ERG/os/td/dt-server$ telnet localhost 1234
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
time
Current time is what?
22::17::58
date
exit
Connection closed by foreign host.
1 Si vous le souhaitez, et si ces programmes sont installés, vous pouvez utiliser netcat (nc) ou
socat. Mais pour ce que l'on a à faire, telnet est largement suffisant.
Comme vous pouvez le voir, la commande date ne renvoie rien, vous devrez la
coder par vous-même. De son côté, le serveur produit la sortie suivante :
cayre@yiking:~/ens/ERG/os/td/dt-server$ ./dt-server
Host yiking
Port: 1234 [COMM]
*** New connection! ***
Found a 'time' command!
Found a 'date' command!
Exiting
*** Closing connection! ***
Le serveur ne permet de gérer qu'un seul client à la fois, si le cœur vous en dit,
vous vous attacherez à en réaliser une version démon multithread qui permet de
gérer plusieurs connexions simultanément.
3 Structure du programme
Le code du programme principal est à compléter dans le fichier server.c . En
particulier, vous devrez réaliser l'enchaînement socket / bind / listen / accept
tel que vu en cours.
À l'aide des fonctions getaddrinfo et freeaddrinfo, vous compléterez la
fonction init_session dans le fichier session.c, qui permet d'initialiser le nom
d'hôte, son adresse IP, et le port sur lequel tournera le serveur.
4 Tricks et astuces
Il est possible que le système ne ferme pas immédiatement le port 1234 en cas
d'arrêt du programme ou de crash. Dans ce cas, si vous le relancez
immédiatement, le système attribuera automatiquement un numéro de port au
hasard. Pour connaître ce numéro de port, utilisez la commande socklist.
5 Pour aller plus loin...
Une fois le serveur codé, vous pourrez, dans le désordre :
–
coder un client
–
intégrer le serveur dans un démon
–
rendre le serveur multithread
–
augmenter ses capacités en lui rajoutant des commandes, éventuellement
avec des arguments. Par exemple, pourquoi ne pas rajouter une commande
print nomfichier qui renvoie le contenu d'un fichier (et vous aurez ainsi un
début de serveur web...)
Bon courage...