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