From dcda721939bc81c58f66850aa21f6b6f0c64cab3 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sun, 23 Jan 2011 14:36:05 +0000 Subject: Refactoring : myhttpd -> tcpserver et process -> dispatcher. Faisaons de belles briques bien claires d'entrée de jeu ! MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///var/svn/2011-usi/trunk@15 db941bf7-0cb3-4dda-9634-87faf64f93a7 --- app/v3_c/src/myhttpd.c | 118 ------------------------------------------------- 1 file changed, 118 deletions(-) delete mode 100644 app/v3_c/src/myhttpd.c (limited to 'app/v3_c/src/myhttpd.c') diff --git a/app/v3_c/src/myhttpd.c b/app/v3_c/src/myhttpd.c deleted file mode 100644 index 9d77949..0000000 --- a/app/v3_c/src/myhttpd.c +++ /dev/null @@ -1,118 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "myhttpd.h" -#include "process.h" -#include "utils.h" - -int end=0; - -void signals(int signum) { - static int force=0; - - if (0) printf("signal %i\n"); - - if(!force) { - end=1; - force=1; - logs("Tentative d'arrêt soft du serveur..."); - } else { - logs("Arrêt d'urgence du serveur"); - exit(1); - } -} - - -int main() { - int res; - int sockServ, sockCli; - struct sockaddr_in servAddr, cliAddr; - socklen_t cliAddrLen; - - // Création socket - sockServ = socket(AF_INET, SOCK_STREAM, 0); - if (sockServ < 0) { perror("socket"); return(2); } - - // Accrochage du socket (adresse et port locaux) - bzero((char *) &servAddr, sizeof(servAddr)); - servAddr.sin_family = AF_INET; - servAddr.sin_addr.s_addr = INADDR_ANY; - servAddr.sin_port = htons(LISTEN_PORT); - res=bind(sockServ, (struct sockaddr *) &servAddr, sizeof(servAddr)); - if (res < 0) { perror("bind"); return(3); } - - // On lance l'écoute - listen(sockServ,LISTEN_BACKLOG); - if (res < 0) { perror("listen"); return(4); } - - // On active la gestion des signaux - signal(2,signals); - - res=initProcess(); - if (res != 0 ) { -#ifdef DEBUG - logs("initProcess() error"); -#endif - return(5); - } - - // Boucle d'acceptation des clients - cliAddrLen = sizeof(cliAddr); - while ( ! end ) { - // Appel bloquant d'acceptation d'un nouveau client - sockCli=accept(sockServ, (struct sockaddr *) &cliAddr, &cliAddrLen); - - // Il y plein de raisons pour qu'un accept echoue - if (sockCli < 0) { - switch(errno) { - case EAGAIN: - case EINTR: - // Cas qui ne sont pas des erreurs, mais nécessitent de rappeler accept -#ifdef DEBUG - perror("accept (info)"); -#endif - break; - case EMFILE: - case ENFILE: - case ENOBUFS: - case ENOMEM: - // Cas d'erreur transitoire (attente d'une seconde histoire d'attendre un peu si ressources fichiers, ram épuisés -#ifdef DEBUG - perror("accept (warn)"); - sleep(1); -#endif - break; - default: - // Cas d'erreur fatales - perror("accept (err)"); - end=2; - } - } else { - // Cas nominal : un nouveau socket est disponible avec un client au bout -#ifdef HEAVYDEBUG - logs("Client accepté"); -#endif - end=requestProcess(sockCli, &cliAddr, &cliAddrLen); - } - } - - freeProcess(); - - if ( end != 1 ) { -#ifdef DEBUG - logs("Fin anormale du serveur"); -#endif - return(6); - } - - return 0; -} - -- cgit v1.2.3