introduction aux réseaux TP 3 : Introduction à la programmation
Transcription
introduction aux réseaux TP 3 : Introduction à la programmation
Université du Littoral Côte d’Opale Licence informatique 3ème année Introduction aux Réseaux Année 2011/2012 introduction aux réseaux TP 3 : Introduction à la programmation réseaux sous UNIX en C Programmation d’un serveur HTTP Objectifs de la séance Le but de cette séance est d’étendre ce que vous avez appris au cours des deux dernières séances. Vous allez programmer un serveur web qui respecte le protocole HTTP et qui va répondre aux requêtes d’un navigateur web quelconque. 1 Le protocole HTTP brièvement Dans ce qui suit, il n’est décrit que les parties en rapport avec ce TP. Pour une description plus détaillé du protocole HTTP vous pouvez consulter http://www.w3.org/Protocols/rfc2616/rfc2616.html. Globalement, l’échange entre le client (navigateur) et le serveur se déroule comme suit : le client demande un document web au serveur, le serveur le lui envoie. Le navigateur reçoit le document et l’analyse, si ce document contient des médias (images, feuilles de styles etc.) le navigateur les demande individuellement au serveur. Celui-ci les envoie. Donc pour schématiser, le client demande un fichier et le serveur le lui envoie. Tous les messages HTTP sont au format texte (ASCII). Voici par exemple une requête d’un navigateur vers un serveur : 1 2 3 4 5 6 7 8 9 GET /toto.html HTTP/1.1 Host: localhost:8000 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.18) Accept: text/xml,application/xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Connection: keep-alive Cache-Control: max-age=0 Les numéros de lignes ne font pas partie du message. Remarquez que chaque ligne est terminée par un retour chariot et que la dernière ligne est vide, c’est une obligation du protocole. La première ligne indique le fichier désiré par le client. Ici le fichier est "/toto.html". Le « / » indique la racine du répertoire Web du serveur, à ne pas confondre avec la racine du système de fichiers. La racine du répertoire web est un répertoire du disque qui contient les documents web et le serveur n’a accès qu’à ces documents. Quand le serveur reçoit une requête il récupère dans sa racine le fichier demandé et répond avec un message qui contient des entêtes suivit du contenu du fichier. Une réponse peut par exemple être la suivante : 1 2 3 4 5 6 7 8 9 HTTP/1.0 200 OK Date: Mon Nov 30 14:38:22 2009 Content-Length: 98644 Content-Type: text/html Connection: close <html> ... ... </html> La première ligne indique par un code (ici 200) que la requête à bien réussi. Si le fichier n’a pas été trouvé dans la racine du serveur, celui-ci doit informer le client par une autre code (404), voir plus bas. La deuxième ligne donne la date et l’heure de la requête. La troisième ligne indique la taille des données en octets, en l’occurrence 1 Tournez la page Université du Littoral Côte d’Opale Licence informatique 3ème année Introduction aux Réseaux Année 2011/2012 la taille du fichier toto.html. La ligne suivante indique le type de données, ici du HTML. Si c’était un fichier image “jpeg” le type serait le type serait Content-Type: image/jpg, de même pour d’autres format d’image. La ligne 5 indique que la connexion sera fermé juste après la réponse. Notez que la ligne 6 est bien vide. Enfin, les lignes de 7 jusqu’à la fin contiennent le contenu du fichier, ici le code HTML mais si c’était, une image ça serait le contenu du fichier image. Dans le cas ou le fichier demandé n’existe pas dans la racine du serveur, celui-ci répond par un message qui ressemble à celui-là : 1 2 3 4 5 6 7 8 9 10 11 12 13 HTTP/1.1 404 Not Found Date: Mon Nov 30 14:38:22 2009 Content-length: 210 Connection: close <!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL was not found on this server.</p> <hr> </body></html> Le code indiquant l’erreur est dans la première ligne (404). Les données entre la ligne 6 et 13 ne sont que le code HTML du ce qui s’affiche sur le navigateur dans le cas d’une erreur. 2 Le serveur Web Le serveur Web que vous devez programmer est une version minimaliste d’un vrai serveur tel que le serveur apache. Ses fonctions se restreindront à répondre aux requêtes des navigateurs (fichier HTML, images, css etc). Le serveur doit suivre les étapes suivantes : – – – – – – gérer les demandes de connexion ; accepter et analyser les requêtes HTTP ; chercher le fichier demandé du disque ; créer une réponse HTTP consistant du fichier précédée des lignes entêtes ; si le fichier n’existe pas, il devra créer un message avec le code 404 ; envoyer la réponse directement au client. 2.1 Programmation Pour ce TP, vous devez compléter le fichier http-s.c qui vous est fournie dans l’archive. Ce fichier contient quelques fonctions qui vous seront utiles, prenez le temps de les comprendre. Vous allez réutiliser le code net_aux.c que vous avez programmé au cours des dernières séances. Votre serveur doit pouvoir gérer plusieurs clients en simultané avec des threads comme vu au TP précédent. Voici la liste de fonctions que vous devez programmer, les prototypes sont dans le fichier http-s.c. 1. Envoi de la page 404 : void send_not_found(int s). Écrire la fonction qui prend en paramètre la socket d’échange et qui envoi le code de la page 404 (page web inexistante) avec les bonnes entêtes. Vous pouvez vous inspirer de ce qui vous a été donner plus haut. 2. Envoi du fichier : void send_file(int s, const unsigned char *data, const char* filename). Écrire la fonction qui prend trois paramètres – la socket de communication. – le pointeur vers les données du fichier – une chaîne de caractère qui contient le nom du ficher 2 Université du Littoral Côte d’Opale Licence informatique 3ème année Introduction aux Réseaux Année 2011/2012 Cette fonction construit la requête que le serveur doit envoyer au client tell qu’il est illustré plus haut. Elle doit déterminer la date et l’heure. Une fois que ces informations sont déterminées, elle crée la chaîne de caractères de l’entête HTTP et l’envoie sur la socket. Après quoi elle envoi les données pointées par le deuxième argument en utilisant la fonction send_binary décrite plus haut. 3. la fonction du thread de gestion de client : void* thrd_client(void *idx). Une fois que toutes les fonctions précédentes sont disponibles, vous pouvez programmer la fonction du thread qui va gérer la communication avec un client. Ce thread va commencé par 1) lire une requête sur la socket, 2) extraire le nom du fichier demandé, 3) lire ce fichier, 4) envoyer la réponse (entête + fichier) ou un message d’erreur 404, 5) fermer la connexion et quitter le thread 4. Compléter la fonction principale : int main(int argc, char** argv). Pour cette fonction vous n’avez normalement qu’a compléter le contenu de la boucle while. Elle doit commencer par trouver un thread non active dans le tableau, le paramétrer avant de le démarrer. 2.2 Quelques recommandations : – Le répertoire racine du serveur doit exister dans le même répertoire que votre programme http-s. Il doit être définie en dur dans le code et doit être nommé www. Il est déclareré avec #define HTTPROOT "www" – N’oubliez pas de libérer la mémoire alloué à l’étape read_file après avoir envoyé le fichier. – Vous pouvez utiliser la fonction char *ctime(const time_t *timep) retourne la date et le temps sous forme de chaîne de caractère. Elle prend en paramètre un pointeur vers le temps courent (timep) qui est la valeur de retour de la fonction time_t time(time_t *t) avec le paramètre NULL. Ces deux fonctions sont définies dans le fichier time.h. Elle vous servira a construire le champ date de la réponse. 3 Travail à fournir pour dans une semaine Pour ce TP les 3 fichiers suivants sont a rendre par mail (lire la procédure ci-dessous) : http-s.c net_aux.c net_aux.h △ ! Tous vos programmes sont à mettre dans une archive tar compressée par gzip. Vous devez nommer cette archive tar avec mon_prenom.tar.gz et l’envoyer par mail à [email protected]. Le sujet du mail doit commencer par [L3-info-tp3], crochets inclus. Vous recevrez un accusé de réception quelques minutes après la réception. En cas d’envois multiples, la dernière version sera prise en compte. Création de l’archive tar et la vérifier : Dans le répertoire tp3 tapez la commande suivante : tar zcvf nom_prenom.tar.gz http-s.c net_aux.c net_aux.h △ ! Avant d’envoyer votre travail, vérifiez le avec la commande fournie : sh verify.sh nom_prenom tp3 1 toujours dans le répertoire tp3. Ce scripte est celui que j’utiliserai pour valider vos fichier. Il créera un répertoire nom_prenom dans tp3 et en sortie vous devez avoir le résultat suivant : Name Present Archive Compile Build Global -------------------------------------------------------------nom_prenom OK OK OK OK OK Si au lieu des 5 OK il y a 1 ER, cela indique que votre programme a échoué à l’une des étapes. Il faudra le corriger avant de l’envoyer. L’évaluation : △ ! Voici les points qui seront évalués : – la compilation : sans aucun warnings et sans aucune erreur ; – l’exécution : sans plantage ; – le respect des protocoles : http-s.c sera compilés avec ma propre version de net_aux.c net_aux.h, si votre programme respecte l’API il n’y aura aucun problème ; – la bonne marche du serveur, il sera testé avec un navigateur. 3