/* lancer rebours-s numero_port */ /* lance un serveur en ecoute sur le port numero_port */ /* pour tester faire telnet adr_ip_serv numero_port */ /* ATTENTION ici les clients sont traites par une file FIFO */ /* le dernier client doit donc attendre que tous les autres aient */ /* été traités avant que sa requete soit prise en compte */ #include #include #include #include #include #include /* taille maximale pour le nom d'une machine */ #define MAXNAME 256 int main(int argc, char *argv[]) { char nom[MAXNAME], chaine[MAXNAME]; int numport, sd, sclient; struct sockaddr_in sa; struct hostent *infos; int j; 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); while (1) { /* accepter une connexion sans récupérer les paramètres du client */ /* créé un nouveau tube pour traiter la demande */ /* le tube initial est de nouveau en attente sur le port */ sclient = accept(sd,NULL,NULL); for (j = 5; j >=0; j--) { /* envoi de données dans le tube */ sprintf(chaine,"%d\n",j); write(sclient,chaine,strlen(chaine)); sleep(1); } /* fermeture du tube temporaire */ close(sclient); } /* fermeture du serveur */ close(sd); }