Rapport de TP sur le mini-serveur HTTP. Maxime Chambreuil - Sébastien Le Digabel



Documents pareils
Cours Programmation Système

Cours 6 : Tubes anonymes et nommés

Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1

Programmation système de commandes en C

Communication par sockets

Le prototype de la fonction main()

Programmation Internet en Java

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

3IS - Système d'exploitation linux - Programmation système

Travaux Pratiques Introduction aux réseaux IP

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Communication sous UNIX les sockets

Le système de gestion des fichiers, les entrées/sorties.

Projet de programmation (IK3) : TP n 1 Correction

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Programmation système I Les entrées/sorties

Rapport final. Mise en place du réseau d'une entreprise de taille moyenne. Date de rendu : 18/07/2011 Promotion : 4PPA SRS

OS Réseaux et Programmation Système - C5

Exercice sur les Dockers

Programmation Réseau. Anthony Busson IUT Info Lyon 1

Programmation Réseau SSH et TLS (aka SSL)

Playing with ptrace() for fun and profit

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

TP2 : tableaux dynamiques et listes chaînées

Programmation système en C/C++

Compression de Données - Algorithme de Huffman Document de Conception

Arguments d un programme

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Les processus. Système L3, /39

Simulation d un système de paiement par carte bancaire

GESTION DES FICHIERS C/UNIX

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Le langage C. Séance n 4

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Lier Erlang avec d autres langages de programmation

Programmation client-serveur sockets - RPC

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Programmation impérative

Les structures de données. Rajae El Ouazzani

Introduction aux Systèmes et aux Réseaux

Le traitement du temps

Cours de C. Allocation dynamique. Sébastien Paumier

Module http MMS AllMySMS.com Manuel d intégration

LA COUCHE TRANSPORT CONTRÔLE LE FLOT DE DONNEES TRANSMISES par la couche Réseau

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Programmation Système (en C sous linux) Rémy Malgouyres LIMOS UMR 6158, IUT département info Université Clermont 1, B.P.

LEs processus coopèrent souvent pour traiter un même problème. Ces

Les fichiers. Chapitre 4

Les structures. Chapitre 3

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

le minimum pour communiquer par réseau (sans toutefois y comprendre grand chose)

Algorithmique et Programmation, IMA

COMPARAISONDESLANGAGESC, C++, JAVA ET

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Programmation en langage C

Java Licence Professionnelle CISII,

1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

TP3 : Manipulation et implantation de systèmes de fichiers 1

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation Réseau en C sous Unix

Travaux Dirigés n 1 : chaînes de caractères

Gestion distribuée (par sockets) de banque en Java

Cours d initiation à la programmation en C++ Johann Cuenin

Cours de Système : Gestion de Fichiers

ALOHA LOAD BALANCER METHODE DE CONTROLE DE VITALITE

Utilisation d objets : String et ArrayList

Chapitre 1 : La gestion dynamique de la mémoire

SUPPORT DE COURS. Langage C

Les chaînes de caractères

Introduction au langage C

Définition des Webservices Ordre de paiement par . Version 1.0


Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Les processus légers : threads. Système L3, /31

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Plateforme PAYZEN. Définition de Web-services

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

Programmation système

Premiers Pas en Programmation Objet : les Classes et les Objets

Bases de programmation. Cours 5. Structurer les données

Programmation en langage C Eléments de syntaxe

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

TD3: tableaux avancées, première classe et chaînes

Transcription:

Rapport de TP sur le mini-serveur HTTP Maxime Chambreuil - Sébastien Le Digabel 16 janvier 2003

Table des matières 1 Détails sur nos travaux 2 1.1 But du TP............................. 2 1.2 La fonction opensocket()..................... 2 1.3 La fonction getfilename().................... 2 1.4 La fonction sendfile()...................... 3 1.5 Conclusion............................. 4 2 Le code 5 1

Chapitre 1 Détails sur nos travaux 1.1 But du TP Le but de ce TP est de réaliser un mini-serveur HTTP. Le client HTTP envoie une requête au serveur. Lorsqu il recoit cette requête, le serveur crée alors une socket qui permettera le dialogue avec le client. Enfin, après analyse de la requête, le serveur revoie la page désirée. 1.2 La fonction opensocket() int opensocket(char* srvr_addr, char* srvr_port) Cette fonction crée une socket à l adresse passée en paramètre : srvr addr : Adresse du serveur srvr port : Port du serveur Elle retourne l identifiant de la scoket créée. Pour cette fonction nous avons utilisé le support de cours sur les sockets pour bien assimiler le principe. Le reste n a été que de la manipulation de code pour l adapter aux circonstances. 1.3 La fonction getfilename() char* getfilename(file* input_stream) Cette méthode permet de retourner le nom du fichier désiré par le client lors de sa requête. La requête arrive sous cette forme : 2

GET /page.html Par conséquent, on devrai découper cette chaîne de caractère pour ne récupérer que : page.html Nous utilisons donc les méthodes de manipulations de chaînes de caractères en C, telles que les fonctions strdup() ou encore strsep() Nous avons d traiter deux cas supplémentaires : Le cas o le fichier n existe pas : Erreur 404 Le cas o le fichier n est pas précisé : Par défaut index.html Pour le cas o le fichier n est pas précisé, il suffit juste de remplacer la chaîne de caractère correspondante au nom du fichier ( ) par une chaîne contenant index.html. 1.4 La fonction sendfile() void sendfile(file* output_stream, char* file_name) Cette fonction permet d envoyer au client le fichier qu il a souhaité obtenir lorsqu il a saisi son url. Son principe est assez simple, on récupère le nom du fichier désiré, on l ouvre, et on envoie sur la socket de sortie ce fichier, caractère par caractère... Pour le cas o le fichier n existe pas, nous avons donc pris connaissance de sa non-existance via la fonction access() qui nous retourne un descripteur, et qui nous permet de savoir si celui ci est valide ou non. S il est valide, pas de problème, s il est invalide, c est qu il n existe pas. Auquel cas le serveur renverra la chaîne suivante : 404 Chaîne que le client affiche pour avertir l utilisateur que sa page n est pas trouvée. On peut aisément remplacer 404 par une phrase un peu plus explicite... 3

1.5 Conclusion Cela marche très très bien, on va pouvoir maintenant programmer le remplacant de Mozilla :) 4

Chapitre 2 Le code #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> 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\ e \ a l adresse IP srvr_addr:srvr_port 5

*/ -1 si impossibilit? de cr\ eer le socket int opensocket(char* srvr_addr,char* srvr_port) { int socketid = 0; struct sockaddr_in socketadresse; int taille; int test; // On met les parametres par defaut si y a besoin if(srvr_addr == "") srvr_addr = "127.0.0.1"; if (srvr_port == "") srvr_port = "8080"; // On cree le socket reseau, TCP socketid = socket(pf_inet,sock_stream,0); if ( socketid == -1) bail ("socket()"); // On reserve l espace memoire pour les parametres du socket memset(&socketadresse,0,sizeof socketadresse); // On renseigne les differents champs socketadresse.sin_family = AF_INET; // L adresse IP socketadresse.sin_addr.s_addr = inet_addr(srvr_addr); // Le port TCP socketadresse.sin_port = htons (atoi(srvr_port)); // Taille de socketadresse taille = sizeof socketadresse; // On specifie les parametres au socket test = bind (socketid,(struct sockaddr *) &socketadresse,taille); if ( test == -1 ) bail("bind()"); // On retourne l identifiant du socket return socketid; 6

/* Sachant que input_stream contient une chaine du type getfilename() retourne : nom_du_fichier si celui ci est precis\ e index.html sinon */ GET /[nom_du_fichier] H char* getfilename(file* input_stream) { int i; char* nomfichier; /* initialisation d une variable temporaire \ a 0 pour \ eviter les erreurs de fin de cha\^ines de caract\ ere */ char* temp = malloc(150*(sizeof(char))); for(i=0;i<150;i++) temp[i]=0; // On recupere la chaine de caractere fgets(temp,150,input_stream); // On enleve le debut : "GET /" soit 5 caracteres temp = strdup(temp+5); // On recupere le nom de la ressource : la chaine avant le premier espace nomfichier = strsep (&temp," "); // On teste si la chaine est vide if (strcmp(nomfichier,"")==0) strcpy(nomfichier,"index.html"); // on affiche du ct\ e serveur le nom du fichier qui sera retourn\ e printf ("nomfichier = \%s\n",nomfichier); // On retourne le nom du fichier return nomfichier; 7

/* sendfile() copie les donn?es contenues dans le fichier r?f?renc? par file_name sinon?crit un message d erreur 404 dans output_stream */ void sendfile(file* output_stream, char* file_name) { FILE* descripteurfichier; char caracterelu; int test; // Variable ne servant qu a la copie ligne a ligne // char* chainelu; // Ouverture du fichier descripteurfichier = fopen(file_name,"rb"); // Si le fichier n existe pas, on retourne une erreur 404 if (access(file_name, F_OK)<0)){ fputc( 4,output_stream); fputc( 0,output_stream); fputc( 4,output_stream); // Si le fichier existe else { do { // on lit dans le fichier caracterelu = fgetc(descripteurfichier); // on copie caractere a caractere dans output_stream fputc(caracterelu,output_stream); /* Code pour la copie ligne a ligne(ne marche pas) fgets(chainelu,200,descripteurfichier); gputs(output_stream,chainelu); while(chainelu!= NULL); 8

*/ // jusqu a ce qu on rencontre le caractere de fin de fichier while(caracterelu!= EOF); // On ferme le fichier fclose(descripteurfichier); 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 ) 9

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; 10