Uv réseau tp6



Yüklə 40,5 Kb.
tarix28.10.2017
ölçüsü40,5 Kb.
#19299



UV Réseau – TP6

Socket et http

Automne 2003





Introduction


Suite au cours de NDE sur les sockets, il vous est demandé de réaliser un mandataire (proxy) de serveur Web.
Un mandataire est un élément du réseau servant d'intermédiaire entre un client (par exemple, le navigateur d'un internaute) et le serveur (par exemple un serveur Web). Tous les messages à destination du serveur transitent ainsi par cet intermédiaire ; ainsi le serveur n’est pas exposé directement au client qui peut être mal intentionné, trop gourmand (service de redondance) ou demander une garantie de qualité de service (service de secours).
Le mandataire que vous devez réaliser devra permettre de rediriger vers les paquet TCP reçu par votre programme (qui écoutera le port 8080 de votre machine) vers le serveur Web qui gére un site (en l’occurrence le site http://www.rezo.net).
Votre réalisation devra lire un fichier de configuration qui indiquera l’adresse IP du serveur Web nominal ainsi que celle de la machine Web de secours.

Trois modes seront possibles pour ce mandataire :



  • maintenance : afficher une page indiquant que le site demandé est indisponible pour cause d’opération de maintenance.

  • redondance : dans le cas où la communication ne passe plus entre le proxy et le serveur Web nominal, alors la requête est envoyée vers le serveur

  • équilibrage de charge : à réception d’une requête, le proxy teste le serveur le plus rapide et il envoie bien entendu la requête vers le serveur le plus rapide.

Les fournitures dont vous disposez sont les suivantes :



  • Un squelette d’application utilisant les sockets ;

  • Un plan de développement itératif ;

  • Le protocole de test (réunissant un ensemble de scenarii que vous appliquerez pendant la séance de TP).



Plan de développement itératif

Pour vous permettre d’avancer de manière itérative, différentes versions testable vous sont proposées.


Fonction des différentes versions

    • Version 1.0 :

      • mode maintenance

    • Version 1.1 :

    • Version 1.2 :

      • fonctions de la version 1.1

      • équilibrage de charge



Protocole de tests

Différents scénarii sont proposés pour évaluer le mandataire. L’architecture réseau sur laquelle les tests seront exécutés est décrite sur la figure suivante :





Toutes les machines seront équipées de systèmes d’exploitation Linux (Debian ou Red Hat). Vous fournirez un code source qui sera compilé sur place.


Plan d’adressage du réseau client (192.168.0.0/24) :

Navigateur Internet : 192.168.0.200

Serveur DNS : 192.168.0.1

Proxy EQP1 : 192.168.0.101

Proxy EQP2 : 192.168.0.102

Routeur EQP1 : 192.168.0.253

Routeur EQP2 : 192.168.0.254
Plan d’adressage du réseau Web EQP1 (192.168.1.0/24) :

Serveur Apache nominal : 192.168.1.100

Routeur EQP1 : 192.168.1.254
Plan d’adressage du réseau Web EQP2 (192.168.2.0/24) :

Serveur Apache secours : 192.168.2.100

Routeur EQP2 : 192.168.2.254

Scénario de tests 1.0.A :

Entrée :


Fichier de configuration config.ini

Serveur = www.rezo.net;

Mode = maintenance ;


Mode opératoire



  • Lancer le mandataire sur la machine qui va bien (Proxy EQP1 ou Proxy EQP2)

  • Configurer le réseau de manière correcte (en particulier le serveur DNS pour que les demandes vers l’adresse www.rezo.net soit routée vers la machine hébergeant votre mandataire)

  • Ouvrir un client Web demandant l’adresse http://www.rezo.net

  • Observer la sortie

Sortie attendue :






Scénario 1.1.A

Entrée :


Fichier de configuration config.ini

Serveur = www.rezo.net;

Port = 8080

Serveur_nominal = 192.168.1.100 ;

Serveur_secours = 192.168.2.100 ;

Mode = redondance ;

Mode opératoire



  • Lancer le mandataire sur la machine qui va bien (Proxy EQP1 ou Proxy EQP2)

  • Configurer le réseau de manière correcte (en particulier le serveur DNS pour que les demandes vers l’adresse www.rezo.net soit routée vers la machine hébergeant votre mandataire)

  • Ouvrir un client Web demandant l’adresse http://www.rezo.net

  • Observer la sortie (1)

  • Stopper le routeur EQP1

  • Observer la sortie (2)

  • Relancer le routeur EQP1




Sortie attendue en 1

Sortie attendue en 2





Cette page est renvoyée par le serveur Web de la machine « Serveur Apache nominale » quand l’adresse www.rezo.net est demandée.

Cette page est renvoyée par le serveur Web de la machine « Serveur Apache de secours » quand l’adresse www.rezo.net est demandée.


Scénario 1.2.A

Entrée :


Fichier de configuration config.ini

Serveur = www.rezo.net;

Port = 8080

Serveur_nominal = 192.168.1.100 ;

Serveur_secours = 192.168.2.100 ;

Mode = equilibrage ;

Mode opératoire



  • Lancer le mandataire sur la machine qui va bien (Proxy EQP1 ou Proxy EQP2)

  • Configurer le réseau de manière correcte (en particulier le serveur DNS pour que les demandes vers l’adresse www.rezo.net soit routée vers la machine hébergeant votre mandataire)

  • Ouvrir un client Web demandant l’adresse http://www.rezo.net

  • Observer la sortie (1)

  • Lancer sur le serveur Apache nominal un processus qui surcharge le processeur

  • Observer la sortie (2)

Sortie attendue :






Squelette de serveur Web


(disponible à l’adresse : http://asi.insa-rouen.fr/enseignement/siteUV/reseaux/2003A/http.c)

/*

http.c


A COMPLETER

*/
#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


static void bail(const char *on_what) {

if ( errno != 0 ) {

fputs(strerror(errno),stderr);

fputs(": ",stderr);

}

fputs(on_what,stderr);



fputc('\n',stderr);

exit(1);


}
/*

openSocket() retourne

l'identifiant d'un socket associé à l'adresse IP srvr_addr:srvr_port

-1 si impossibilité de créer le socket

*/

int openSocket(char* srvr_addr,char* srvr_port) {



}
/*

Sachant que input_stream contient une chaine du type GET

/[nom_du_fichier] HTTP/1.0

getFileName() retourne :

nom_du_fichier si celui ci est precisé

index.html sinon

*/

char* getFileName(FILE* input_stream) {



}
/*

sendFile() copie les données contenues dans le fichier référencé par

file_name (si ce dernier existe)

sinon écrit un message d'erreur 404 dans output_stream

*/

void sendFile(FILE* output_stream, char* file_name) {



}
void do_process(int client_socket) {

FILE* output_stream;

FILE* input_stream;

char* file_name;


input_stream=fdopen(client_socket,"r");

if (input_stream!=NULL) {

output_stream=fdopen(dup(client_socket),"w");

if (output_stream!=NULL) {

file_name=getFileName(input_stream) ;

if (file_name!=NULL) {

sendFile(output_stream,file_name);

free(file_name);

}

fclose(input_stream);



fclose(output_stream);

} else {


fclose(input_stream);

}

}



}
int main(int argc,char **argv) {

int socket = -1;

int client_socket = -1;

pid_t PID;

int len_inet;

struct sockaddr_in adr_clnt;


socket=openSocket("127.0.0.1","8080");

if ( socket == -1 )

bail("openSocket()");
if ( listen(socket,10)==-1 )

bail("listen()");


for (;;) {

len_inet = sizeof adr_clnt;

client_socket = accept(socket,(struct sockaddr *) &adr_clnt,

&len_inet);

if ( client_socket == -1 )

bail("accept()");

if ( (PID = fork()) == -1 ) {

close(client_socket);

continue;

} else if ( PID > 0 ) {

close(client_socket);

continue;

}

do_process(client_socket);



exit(0);

}

close(socket);



return 0;

}





INSA-ROUEN / ASI Page /


Yüklə 40,5 Kb.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2022
rəhbərliyinə müraciət

    Ana səhifə