#include #include #include #include #include #include #include #include #include #include /* taille maximale pour le nom d'une machine */ #define MAXNAME 256 /* taille max du buffer de lecture */ #define MAX 512 void finfils(int sig) { /* on traite la fin d'un fils quelconque de façon non blocante */ while (waitpid(-1,NULL,WNOHANG) >0) ; } int main(int argc, char *argv[]) { char nom[MAXNAME], chaine[MAXNAME]; int numport, sd, sclient, op1, op2, res ,nblus; char op; struct sockaddr_in sa,sc; struct hostent *infos; pid_t pid; socklen_t longueur; char buffer[MAX]; char commande[4]; time_t temps; struct tm *rep; char *mois[12] = {"Jan","Fev","Mars","Apr","Mai","Jui","Juil","Aou","Sep","Oct","Nov","Dec"}; numport = atoi(argv[1]); /* on récupère le nom de la machine ou le prog est lancé */ gethostname(nom,MAXNAME); /* on récupère alors son adresse ip */ infos = gethostbyname(nom); /* mise en place d'un tube de communication réseau */ sd = socket(AF_INET,SOCK_STREAM,0); /* préparation des données nécessaires à la configuration du tube */ memset(&sa,0,sizeof(sa)); sa.sin_family = AF_INET; /* numéro du port de communication */ /* transformé en notation réseau */ /* pour éviter les problèmes big endian, little endian */ sa.sin_port = htons(numport); /* adresse ip du serveur */ sa.sin_addr.s_addr = *((unsigned long int *)(infos -> h_addr)); /* configuration du tube avec les données précédentes */ bind(sd,(struct sockaddr *)&sa,sizeof(sa)); /* écoute sur le tube, max 10 clients */ listen(sd,10); /* pour récupérer le signal des fils quand ils ont terminé */ signal(SIGCHLD,finfils); while (1) { /* accepter une connexion en récupérant les paramètres du client */ /* deuxième param = struct pour l'adresse du client */ /* troisième param = longueur de l'adresse récupéré */ /* il faut initialiser ce troisième param à la taille */ /* de la structure adresse (spécifié dans le man) */ /* accept créé un nouveau tube pour traiter la demande */ longueur = sizeof(struct sockaddr_in); sclient = accept(sd,(struct sockaddr *)&sc,&longueur); pid = fork(); if (pid == 0) { nblus = read(sclient,buffer,MAX); buffer[nblus] = '\0'; /* on enleve les espaces avec sscanf */ sscanf(buffer,"%s",commande); while (strcmp(commande,"QUIT") != 0) { if (strcmp(commande,"DATE") == 0) { time(&temps); rep = localtime(&temps); sprintf(buffer,"%d %s %d\n",rep->tm_mday,mois[rep->tm_mon],rep->tm_year+1900); write(sclient,buffer,strlen(buffer)); } else if (strcmp(commande,"TIME") == 0) { time(&temps); rep = localtime(&temps); sprintf(buffer,"%d:%d:%d\n",rep->tm_hour,rep->tm_min,rep->tm_sec); write(sclient,buffer,strlen(buffer)); } nblus = read(sclient,buffer,MAX); buffer[nblus] = '\0'; sscanf(buffer,"%s",commande); } /* fermeture du tube temporaire */ close(sclient); exit(0); } else close(sclient); } /* fermeture du serveur */ close(sd); }