//Déclarations des packages #include #include #include #include #include #include #include //Définitions des constantes #define BUFFERMAX 100 #define MAX_IP 16 #define MAX_TITRE 128 #define MAX_FICHIER 50 int main(){ struct sockaddr_in adr_serveur; /* structures de données contenant */ struct sockaddr_in adr_client; /* les adresses du client et serveur */ socklen_t adr_client_size; /* taille de l'adresse du client */ char buf[BUFFERMAX]; /* buffer pour les données reçues*/ ssize_t num_lues; /* taille des donnees lues */ int sock; /* la socket initiale (d'écoute) */ int num_ecrit; int sock_effective; /* la socket de communication */ int ret; /* valeur de retour des fonctions */ char* list="list"; /*constantes pour plus de lisibilité dans les strcmp*/ char* ready="ready"; char* quit="quit"; char* next="next"; char* fin="fin"; DIR* repertoire; /*pointe le répertoire de partage*/ struct dirent* lectrep; /*pointe sur un fichier du rép de partage*/ char tableau[MAX_FICHIER][MAX_TITRE]; /*tableau destiné a contenir les différents noms des fichiers du rép partage*/ int nbfic=0; /*compte le nb de fichier dans le répertoire de partage et dont le nom reste a envoyer au client*/ /* création de la socket de communication */ sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0){ perror("Erreur de (socket)"); exit(EXIT_FAILURE); } /* initialisation de la structure representant l'adresse */ memset( &adr_serveur, 0, sizeof(adr_serveur) ); /* on la met a zero */ adr_serveur.sin_family = AF_INET; /* on fixe le protocole IP */ adr_serveur.sin_port = 8000; /* on fixe le port de comm */ inet_aton("0.0.0.0", &adr_serveur.sin_addr); /* on fixe l'ip sur laquelle on ecoute */ /* association de l'adresse IP locale a la socket du serveur */ ret = bind( sock, (struct sockaddr*) &adr_serveur, sizeof(adr_serveur) ); if( ret == -1 ) { perror("Erreur de (bind)"); exit(EXIT_FAILURE); } printf("Serveur demaré (ip: %s, port: %d)\n", inet_ntoa(adr_serveur.sin_addr),adr_serveur.sin_port); /* on fixe le nombre max de client dans la file d'attente (ici 2) */ ret = listen(sock, 2); if( ret == -1 ) { perror("Erreur de (listen)"); exit(EXIT_FAILURE); } /* Attente d'un client */ adr_client_size = sizeof(adr_client); /* taile de la struct adr du client*/ /*Soit le serveur attends un client, soit il "discute" avec*/ for(;;){ /* sock_effective est un clone de sock a travers laquelle le client nous parle */ sock_effective = accept( sock, (struct sockaddr*) &adr_client, &adr_client_size); if ( sock_effective == -1 ){ perror("Erreur de (accept)"); exit(EXIT_FAILURE); } /*lecture d'un message provenant d'un client*/ num_lues = read( sock_effective, buf, BUFFERMAX); if ( num_lues == -1 ){ perror("Erreur de (read)"); exit(EXIT_FAILURE); } buf[num_lues] = '\0'; /*si on reçoit quit on ferme la socket avec le client*/ if(strcmp(buf, quit)==0){ printf("Le client (%s) dit : %s \n", inet_ntoa(adr_client.sin_addr), buf); /* on ferme la socket avec le client */ ret = close(sock_effective); if ( ret == -1 ){ perror("Erreur de (close)"); exit(EXIT_FAILURE); } printf("Fermeture de la socket effective"); } /*si on recoit list on regarde le répertoire de partage*/ else if(strcmp(buf, list)==0){ printf("Le client (%s) dit : %s \n", inet_ntoa(adr_client.sin_addr), buf); /*on ouvre le répertoire de partage*/ repertoire=opendir("blagues"); if(repertoire==NULL){ /*si le répertoire n'existe pas on envoie fin*/ num_ecrit = write(sock, fin, strlen(fin)); if (num_ecrit != strlen(fin)){ perror("Erreur de (write)"); exit(EXIT_FAILURE); } printf("On envoie fin"); } else{ /*création d'un tableau contenant les noms des fichiers*/ lectrep=readdir(repertoire); nbfic=1; while (lectrep!=NULL){ strcpy(tableau[nbfic-1], lectrep->d_name); lectrep=readdir(repertoire); nbfic++; } /*une fois le tableau créé on envoie ready*/ num_ecrit = write(sock, ready, strlen(ready)); if (num_ecrit != strlen(ready)){ perror("Erreur de (write)"); exit(EXIT_FAILURE); } printf("On envoie ready"); } } /*si on recoit next on cherche a envoyer le nom d'un fichier*/ else if(strcmp(buf, next)==0){ if(nbfic!=0){ /*si il reste des fichiers on envoie un nom et on décrément le nb de fichiers restants a envoyer*/ num_ecrit = write(sock_effective, tableau[nbfic-1], strlen(tableau[nbfic-1])); if (num_ecrit != strlen(tableau[nbfic-1])){ perror("Erreur de (write)"); exit(EXIT_FAILURE); } printf("On envoie un nom de fichier"); } else{ /*s'il n'y a plus de nom de fichiers en envoyer on envoie fin*/ num_ecrit = write(sock_effective, fin, strlen(fin)); if (num_ecrit != strlen(fin)){ perror("Erreur de (write)"); exit(EXIT_FAILURE); } printf("On envoie fin"); } } } /* On ferme la socket d'ecoute de connexion */ ret = close(sock); if ( ret == -1 ){ perror("Erreur de (close)"); exit(EXIT_FAILURE); } return EXIT_SUCCESS; }