void communication(int soc, struct sockaddr *from, socklen_t fromlen) { int s; char buf[BUFSIZE]; ssize_t nread; char host[NI_MAXHOST]; bool result; char *pf; enum op { GET, PUT } operation; /* Eventuellement, inserer ici le code pour la reconnaissance de la * machine appelante */ s = getnameinfo(from,fromlen,host,NI_MAXHOST,NULL,0,NI_NUMERICHOST); if(s!=0){ perror("cant not getnameinfo\n"); exit(EXIT_FAILURE); } printf("a client connect -host:%s!!\n",host); /* Reconnaissance de la requete */ nread = read(soc, buf, BUFSIZE); printf("recu:%s\n",buf); if (nread > 0) { if (strncmp(buf, "GET", 3) == 0) operation = GET; } else { perror("Erreur lecture socket"); return; } switch (operation) { case GET: pf = strtok(buf + 4, " "); /* ===little example for strtok()==== printf("=========\n"); while(pf){ printf("%s\n",pf); pf = strtok(NULL," "); } exit(EXIT_SUCCESS); */ /* redireciton???? if(strcmp(pf,"/")==0){ envoiRep(".",soc); } */ /* On pointe alors sur le / de "GET /xxx HTTP... * strtok() rend l'adresse du premier caractere * apres l'espace et termine le mot par '\0' */ pf++; /* pour pointer apres le slash */ /* pf pointe sur le nom du fichier suivant le / de la requete. * Si la requete etait "GET /index.html ...", alors pf pointe sur * le "i" de "index.html" */ //index if(strcmp("index.html",pf)==0){ printf("he wants a index.html.\n"); envoiRep(".",soc); }else{ printf("he wants %s\n",pf); /* si le fichier est un fichier ordinaire, on l'envoie avec la fonction * envoiFichier(). * Si c'est un repertoire, on envoie son listing avec la fonction * envoiRep(). * Vous pouvez utiliser la fonction typeFichier() ci-dessous pour tester * le type du fichier. */ /************ A completer ici**********/ enum TypeFichier typef = typeFichier(pf); switch(typef){ case ERREUR: //perror("error to know stat of the fichier\n"); printf("File not exits\n"); write(soc,ERROR404,strlen(ERROR404)); break; case NORMAL: //file printf("This is normal file\n"); //if true wait to send another one envoiFichier(pf,soc); break; case REPERTOIRE: //directory printf("This is normal directory\n"); envoiRep(pf,soc); break; } } } close(soc); }
void communication(int soc, struct sockaddr_storage from, socklen_t fromlen) { int s; char buf[BUFSIZE]; ssize_t nread; char host[NI_MAXHOST]; bool result; char *pf; enum op { GET, PUT } operation; /* Eventuellement, inserer ici le code pour la reconnaissance de la * machine appelante */ /* Reconnaissance de la machine cliente */ s = getnameinfo((struct sockaddr *)&from, fromlen, host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s == 0) printf("Client '%s'\n", host); else fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s)); /* Reconnaissance de la requete */ nread = read(soc, buf, BUFSIZE); if (nread > 0) { if (strncmp(buf, "GET", 3) == 0) operation = GET; } else { perror("Erreur lecture socket"); return; } switch (operation) { case GET: pf = strtok(buf + 4, " "); /* On pointe alors sur le / de "GET /xxx HTTP... * strtok() rend l'adresse du premier caractere * apres l'espace et termine le mot par '\0' */ pf++; /* pour pointer apres le slash */ /* pf pointe sur le nom du fichier suivant le / de la requete. * Si la requete etait "GET /index.html ...", alors pf pointe sur * le "i" de "index.html" */ /* si le fichier est un fichier ordinaire, on l'envoie avec la fonction * envoiFichier(). * Si c'est un repertoire, on envoie son listing avec la fonction * envoiRep(). * Vous pouvez utiliser la fonction typeFichier() ci-dessous pour tester * le type du fichier. */ /************ A completer ici**********/ if(typeFichier(pf) == NORMAL){ envoiFichier(pf,soc); }else if(typeFichier(pf) == REPERTOIRE){ envoiRep(pf,soc); }else{ ; } break; case PUT: perror("service not implmented!"); exit(-1); } close(soc); }