yad40 | Bon merci à tous pour votre aide, j'arrive à la fin de mon programme !
Je voudrais savoir ce que vous en pensez, ce que vous rajouteriez, si il y a des choses qui vous paraissent incorrectes etc...
Code :
- /* ----------------------------------------
- Serveur socket
- thread http html
-
- gcc http.c -D_REENTRANT -lpthread -o http
-
- ------------------------------------------- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <netinet/in.h>
- #include <string.h>
- #include <pthread.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <unistd.h>
- #include <time.h>
- char html[65000];
- int desc;
- struct sockaddr_in adresse;
- int longueur=sizeof(struct sockaddr_in);
- pthread_t tid;
- char root[128];
- char logg[32];
- char port[5];
- void heure()
- {
- time_t t;
- struct tm *tm;
- time(&t);
- printf("%s\t",ctime(&t));
- }
- void ouvrir_conf()
- {
- int d,j=0,i=0;
- char c;
- char conf[1024];
- if((d=open("http.conf", O_RDONLY))==-1)
- {
- heure();
- perror("Erreur open() fichier de configuration" );
- exit(3);
- }
- else
- {
- while(read(d, &c, sizeof(char))!=0)
- {
- conf[j]=c;
- j++;
- }
- conf[j]='\0';
- close(d);
- j=0;
- do
- {
- if((conf[j]=='=') && (conf[j-1]=='t') && (conf[j-2]=='r') && (conf[j-3]=='o') && (conf[j-4]=='p'))
- {
- do
- {
- port[i]=conf[j+1+i];
- i++;
- }
- while(conf[j+1+i]!='\n');
- port[i]='\0';
- i=0;
- }
- if((conf[j]=='=') && (conf[j-1]=='g') && (conf[j-2]=='o') && (conf[j-3]=='l'))
- {
- do
- {
- logg[i]=conf[j+1+i];
- i++;
- }
- while(conf[j+1+i]!='\n');
- logg[i]='\0';
- i=0;
- }
- if((conf[j]=='=') && (conf[j-1]=='t') && (conf[j-2]=='o') && (conf[j-3]=='o') && (conf[j-4]=='r'))
- {
- do
- {
- root[i]=conf[j+1+i];
- i++;
- }
- while(conf[j+1+i]!='\n');
- root[i]='\0';
- i=0;
- }
- j++;
- }
- while(conf[j]!='\0');
- }
- heure();
- printf("Chemin des Sites web : %s\n", root);
- heure();
- printf("Chemin du fichier de log : %s\n", logg);
- heure();
- printf("Numéro du port : %s\n", port);
- }
- void ssighup(int sig_num)
- {
- heure();
- printf("Fin de l'application\n" );
- close(desc);
- ouvrir_conf();
- desc==socket(AF_INET,SOCK_STREAM,0);
- // Structure Serveur
- adresse.sin_family=AF_INET;
- adresse.sin_addr.s_addr=INADDR_ANY;
- adresse.sin_port=htons(atoi(port));
- // Attachement en local (bind)
- if(bind(desc,(struct sockaddr *)&adresse,longueur)==-1)
- {
- heure();
- perror("Erreur bind()" );
- exit(1);
- }
- heure();
- printf("serveur attaché en local\n" );
- // Ecoute
- if(listen(desc,5)==-1)
- {
- heure();
- perror("Erreur listen()" );
- exit(1);
- }
- heure();
- printf("Serveur en écoute\n" );
- }
- int ouvrir(char* msgrc, int desc2)
- {
- int i=0, j=0;
- char result[256];
- char url[512];
- do
- {
- if((msgrc[j]=='G') && (msgrc[j+1]=='E') && (msgrc[j+2]=='T') && (msgrc[j+3]==' '))
- {
- do
- {
- result[i]=msgrc[j+4+i];
- i++;
- }
- while((msgrc[j+3+i]!=' ') && (msgrc[j+4+i]!='H') && (msgrc[j+5+i]!='T') && (msgrc[j+6+i]!='T') && (msgrc[j+7+i]!='P') && (msgrc[j+8+i]!='/'));
- result[i]='\0';
- i=0;
- }
- j++;
- }
- while(msgrc[j]!='\0');
- j=0;
- i=0;
- do
- {
- url[i]=root[i];
- i++;
- }
- while(root[i]!='\0');
- do
- {
- url[i]=result[j];
- i++;
- j++;
- }
- while(result[j]!='\0');
- url[i]='\0';
- i=0;
- j=0;
- do
- {
- i++;
- }
- while(url[i]!='\0');
- // printf("%s\n", url);
- i--;
- if(url[i]!='l' && url[i-1]!='m' && url[i-2]!='t' && url[i-3]!='h' && url[i-4]!='.')
- {
- url[i+1]='/';
- url[i+2]='i';
- url[i+3]='n';
- url[i+4]='d';
- url[i+5]='e';
- url[i+6]='x';
- url[i+7]='.';
- url[i+8]='h';
- url[i+9]='t';
- url[i+10]='m';
- url[i+11]='l';
- url[i+12]='\0';
- }
- if(url[i]=='/')
- {
- url[i+1]='i';
- url[i+2]='n';
- url[i+3]='d';
- url[i+4]='e';
- url[i+5]='x';
- url[i+6]='.';
- url[i+7]='h';
- url[i+8]='t';
- url[i+9]='m';
- url[i+10]='l';
- url[i+11]='\0';
- }
- heure();
- printf("%s Page a affichée : %s\n", inet_ntoa(adresse.sin_addr.s_addr), url);
- int d;
- char c;
- int fp=0;
- char msgerror[1024] = "<h3>Erreur 404, Fichier ou Dossier non trouvé</h3>\0";;
- j=0;
- if ((d=open(url, O_RDONLY))==-1)
- {
- // if(write(desc2,(void *)msgerror,strlen(msgerror),0,(struct sockaddr *)&adresse,sizeof(adresse))==0)
- if(write(desc2,(void *)msgerror,strlen(msgerror))==0)
- {
- heure();
- printf("%s ", inet_ntoa(adresse.sin_addr.s_addr));
- perror("Erreur write() message d'erreur" );
- memset(url, 0, sizeof(url));
- exit(2);
- }
- return(1);
- }
- else
- {
- if((d=open(url, O_RDONLY))!=-1)
- {
- while(read(d, &c, sizeof(char))!=0)
- {
- if (c!='\n')
- {
- html[j]=c;
- j++;
- }
- }
- }
- close(d);
- memset(url, 0, sizeof(url));
- return(0);
- }
- }
- void *serverthread(desc2)
- {
- heure();
- printf("%s Thread lancé\n", inet_ntoa(adresse.sin_addr.s_addr));
- heure();
- printf("%s Lecture des informations emises par le client\n", inet_ntoa(adresse.sin_addr.s_addr));
- char msgrc[512];
- int opn;
- // if(read(desc2,(void *)msgrc,512,0,(struct sockaddr *)&adresse,&longueur)==0)
- if(read(desc2,(void *)msgrc,512)==0)
- {
- printf("%s ", inet_ntoa(adresse.sin_addr.s_addr));
- perror("Erreur read()" );
- exit(3);
- }
- if((opn=ouvrir(msgrc, desc2))==0)
- {
- // if(write(desc2,(void *)html,strlen(html),0,(struct sockaddr *)&adresse,sizeof(adresse))==0)
- if(write(desc2,(void *)html,strlen(html))==0)
- {
- heure();
- printf("%s ", inet_ntoa(adresse.sin_addr.s_addr));
- perror("Erreur write() affichage html" );
- exit(2);
- }
- memset(html, 0, sizeof(html));
- }
- // emission
- heure();
- printf("%s Thread terminé\n", inet_ntoa(adresse.sin_addr.s_addr));
- close(desc2);
- heure();
- printf("%s Connexion fermée\n", inet_ntoa(adresse.sin_addr.s_addr));
- pthread_exit((int *)tid);
- }
- int main()
- {
- ouvrir_conf();
- sigset_t sigmask;
- struct sigaction action, old_action;
- sigemptyset(&sigmask);
- action.sa_handler = ssighup;
- action.sa_flags = 0;
- if (sigaction(SIGINT,&action,&old_action)==-1)
- {
- heure();
- perror("Erreur sigaction()" );
- exit(1);
- }
- int desc2;
- desc=socket(AF_INET,SOCK_STREAM,0);
- // Structure Serveur
- adresse.sin_family=AF_INET;
- adresse.sin_addr.s_addr=INADDR_ANY;
- adresse.sin_port=htons(atoi(port));
- // Attachement en local (bind)
- if(bind(desc,(struct sockaddr *)&adresse,longueur)==-1)
- {
- heure();
- perror("Erreur bind()" );
- exit(1);
- }
- heure();
- printf("serveur attaché en local\n" );
- // Ecoute
- if(listen(desc,5)==-1)
- {
- heure();
- perror("Erreur listen()" );
- exit(1);
- }
- heure();
- printf("Serveur en écoute\n" );
- while(1)
- {
- if((desc2=accept(desc, (struct sockaddr *)&adresse, &longueur)) < 0)
- {
- heure();
- perror("Erreur sur accept()" );
- // exit(1);
- }
- heure();
- printf("Connexion acceptée\n" );
- if(pthread_create(&tid, NULL, serverthread, (void *)desc2)!=0)
- {
- heure();
- perror("Erreur sur pthread_create()" );
- // exit(1);
- }
- }
- pause();
- return(0);
- }
|
Note : Il y a maintenant un fichier de configuration :
Citation :
# http.conf
#
# Fichier de configuration du serveur http
port=8080
log=monlog.log
root=/home/clement/web
|
Note : J'ai laissé tombé le nettoyage propre avec SIGINT
J'ai remplacé le SIGHUP par SIGTERM pour pouvoir tester beaucoup plus facilement
Il me reste juste à gérer que tous les affichages écrans s'affichent à la fois sur l'écran mais aussi dans le fichier de log, j'ai regardé la fonction dup2 (man dup2 + internet mais je ne l'ai pas bien comprise - par contre sigaction sans aucuns problèmes -)
Un dernier petit coup de pouce svp !
Merci encore ! |