This is an old revision of the document!
Programmation Socket
Dans ce TP, nous n'utiliserons pas les machines virtuelles. Durée : 4h.
Test des Sockets en C++
L'archive socket.tgz montre un exemple de client/serveur TCP/IP en C++ utilisant les sockets. Dans cet exemple, un client (client.cpp) reçoit le message “hello world” envoyé par le serveur (server.cpp) et l'affiche sur le terminal.
- Récupérez l'archive, décompressez-la et compilez-là (make clean ; make).
- Ouvrez deux terminaux et testez cet exemple :
$ ./server 8888 $ ./client localhost 8888
- Analysez les classes SocketServer et SocketClient définies dans les fichiers socket.cpp et socket.h.
- A quoi sert la fonction work() dans ces classes ? Que représente l'argument fdw passé à cette fonction ?
- A quoi servent les fonctions sendmsg() et recvmsg() ?
- Modifiez le message envoyé par votre serveur et testez-le.
- Connectez votre client au serveur de votre voisin
- Détaillez grossièrement les étapes nécessaires au client et au serveur pour établir une connexion TCP/IP : socket, bind, listen, accept, connect…
- A quoi sert la fonction pthread_create() côté serveur ?
Nota Bene : Il n'est pas nécessaire de comprendre le détail technique du fonctionnement des Sockets.
Serveur daytime
- En vous servant de l'exemple précédent, créez un serveur daytime qui affiche la date et l'heure courante dès qu'un client se connecte.
- Programmez un client pour ce service.
- Testez également votre programme avec la commande telnet.
Programmer son navigateur web (client HTTP)
Il s'agit maintenant de programmer un client HTTP minimaliste qui permet de demander une page web à un serveur web de votre choix (par exemple, www.emi.u-bordeaux.fr). Pour demander la page d'accueil (“/index.html” ou “/”) à un serveur, il suffit de lui envoyer la requête HTTP suivante “GET / HTTP/1.0\r\n\r\n”
.
- Programmez un tel client (dans un nouveau fichier get.cpp), qui envoie la requête GET et affiche sur son terminal la réponse HTTP du serveur.
- Voici un petit extrait de code pour vous aider à afficher la réponse du serveur web :
int r; char buffer[size]; while( (r= read(fd,buffer,size)) > 0)) write(fd,buffer,r);
IPv6
Faites en sorte que le programme get
fonctionne en IPv6 :
- Fonctionnement en IPv6 seul : regardez du coté de
AF_INET6, IN6ADDR_ANY_INIT, in6_addr, getaddrinfo, …
- Fonctionnement Mixte IPv4 et IPv6
Exercice Bonus
Documentation
Un peu de documentation concernant la programmation d'application réseau client/serveur en mode connecté (TCP/IP) avec les sockets :