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...