//-------------------------------------------------------------------- // Serveur à lancer avant le client //---------------------------------------------------------------------- #include #include #include //pour les socket #include #include // pour hostent, servent #include // pour bcopy, ... #define MAXNOM 256 // traitement effectué sur la machine 'serveur' //authentification(soc) renvoiFichier (soc) int soc; { char buf[80]; char tem[1]; int lon; if ((lon = read(soc, buf, sizeof(buf))) <=0){ return ;} buf[lon]='\0'; FILE * fichier; if((fichier = fopen(buf, "r")) == NULL) { printf("impossible d'ouvrir le fichier\n"); char tab [26]; strcpy(tab, "Erreur: pas de fichier de ce type"); write(soc,tab,sizeof(tab)); return -1; } while (1) { tem[0]=fgetc(fichier); //tem[1]='\0'; if (!feof(fichier)) write(soc,tem,sizeof(tem)); else break; } fclose (fichier); return; } //----------------------------------------------------------------------- main(argc,argv) int argc; char **argv; { int sd, // descripteur de socket nsd, // [nouveau] descripteur de socket ladcour; // longueur d'adresse courante d'un client struct sockaddr_in adsock, // structure d'adresse locale adclcour; // adresse client courant struct hostent *hptr; // les infos récupérées sur la machine host struct servent *sptr; // les infos récupérées sur le service de la machine char machine[MAXNOM+1]; // nom de la machine locale char * prog; prog=argv[0]; // recupération de la structure d'adresse en utilisant le nom gethostname(machine,MAXNOM); // recuperation du nom de la machine // recuperation de la structure d'adresse en utilisant le nom if ((hptr=gethostbyname(machine))==NULL) { perror(">> Machine inconnue"); exit(1); } // initialisation de la structure adsock avec les infos recupérées // copie de hptr vers adsock bcopy((char *)hptr->h_addr, (char *)&adsock.sin_addr, hptr->h_length); adsock.sin_family=hptr->h_addrtype; // ou bien AF_INET adsock.sin_addr.s_addr=INADDR_ANY; // ou bien AF_INET adsock.sin_port= htons(5000); // creation d'un socket if ((sd=socket(AF_INET,SOCK_STREAM,0))<0) { perror(">> Probleme de creation du socket"); exit(1); } // association du socket sd à la structure d'adresse asock if ((bind(sd,(struct sockaddr *)&adsock, sizeof(adsock)))<0) { perror(">> Probleme avec le binding"); exit(1); } printf("%d = Num-Port\n", ntohs(adsock.sin_port)); // juste une trace // initialisation de la queue d'ecoute listen(sd,5); //attente des connexions et traitement for(;;) { ladcour=sizeof(adclcour); // adclcour sera renseigné par accept via les infos du connect if ((nsd = accept(sd, (struct sockaddr *)&adclcour, (socklen_t *)&ladcour)) <0) { perror(">> Probleme sur l'accept"); exit(1); } if(fork()==0) { setsid() close(sd); renvoiFichier(nsd); //traitement du fichier close(nsd); exit (0); // exit du processus fils } else { close(nsd); } } } //main