void GererClient(FILE* f, struct Physique* conn) { REQUETE requete; INFOS entetes; int heure; int donneesRecues; donneesRecues = sizeof (REQUETE); if (Reception(conn, &requete, &donneesRecues) == -1) { printf("Erreur lors de la reception des données"); exit(1); } system("clear"); heure = requete.Heure; entetes = LireEntetes(f); if (entetes.PlacesLibres <= 0) requete.NumTicket = -1; else { requete.NumTicket = ReserverTicket(f, requete.Heure); } if (EnvoiServeur(conn, &requete, sizeof (REQUETE)) == -1) { printf("Erreur lors de l'envoi des données"); exit(1); } ListerFichierAsync(FICHIER_INFOS); }
void GererClient(FILE* f, struct Physique* conn) { REQUETE requete; int donneesRecues; donneesRecues = sizeof (REQUETE); if (Reception(conn, &requete, &donneesRecues) == -1) { printf("Erreur lors de la reception des données"); exit(1); } system("clear"); if (requete.NumTicket = Doublon(f, IPDistante(conn), PortDistant(conn), requete.NumTransac)) { printf("Reception d'un doublon pour %d\n", requete.NumTransac); } else { switch (requete.Code) { case RESERVATION: GererReservationClient(f, conn); break; case PAYEMENT: GererPaiementClient(f, conn, requete); break; case VALIDERPAYEMENT: GererValidationPaiementClient(f, conn, requete); break; default: printf("Réception d'une reqûete inconnue"); }; } ListerFichierAsync(FICHIER_INFOS); }
/* Realise la connexion du client en parametre sur le serveur FTP retourne 1 si client connecte et 0 sinon*/ int connecterClient(Client *client){ char *message = NULL; /* Message du client */ char * messageSave; char *requete = NULL; /* Requete client */ char *utilisateur = NULL; /* Nom d'utilisateur du client */ printf("Demande de connexion client\n"); /* On demande le nom d'utilisateur au client */ printf("On demande le nom d'utilisateur\n"); Emission("220 - Saisir utilisateur (max 50 caracteres) : \n", client); /* On recupere la reponse du client qui doit etre sous forme USER utilisateur */ message = Reception(client); /* On alloue de la memoire a la variable de sauvegarde pour pouvoir sauvegarder le message */ messageSave = (char*) malloc(60); /* On sauvegarde le message recu */ strcpy(messageSave,message); /* On analyse le message du client pour voir s'il est conforme */ /* On decoupe le message du client pour extraire les informations */ requete = strtok(message, " \n"); utilisateur = strtok(NULL," \n"); /* On teste que la requete est bien USER */ if(strcmp(requete,"USER") != 0){ /* requete incorrecte */ printf("Requete incorrecte : mauvaise commande\n"); Emission("500 - Requete incorrecte\n",client); return 0; }else{ /* On teste que l'utilisateur n'est pas NULL */ if(utilisateur == NULL || strcmp(utilisateur,"") == 0){ printf("Utilisateur NULL ou vide\n"); Emission("501 - Utilisateur NULL ou vide\n",client); return 0; }else{ /* On teste maintenant que la requete n'est pas trop longue */ /* On cree une requete de test qui est de la bonne longueur */ char *testLongueurMessage; /* On lui alloue de la memoire */ testLongueurMessage = (char*) malloc(60); sprintf(testLongueurMessage,"USER %s\n",utilisateur); /* On teste maintenant si la requete que l'on a recu du client fait la bonne longueur */ if(strlen(testLongueurMessage) != strlen(messageSave)){ /* requete incorrecte */ printf("Requete incorrecte : probleme de longueur\n"); Emission("500 - Requete incorrecte\n",client); return 0; }else{ /* On autorise la connexion du client sur le serveur */ printf("Connexion autorisee pour l'utilisateur %s\n",utilisateur); Emission("230 : Connexion etablie\n",client); return 1; } } } }
int main() { /* VARIABLES */ char *req; //Requête de l'utilisateur char *srvAddress; //Adresse du serveur char *username; //Nom de connexion de l'utilisateur char *password; //Mot de passe de l'utilisateur char *sessionid; //Identifiant de session char *reqRec; //requete reçue en réception int retour; //Variable de retour int again; //variable de boucle char requete[100] = {0}; //requete transmise au serveur /* INITIALISATION DES VARIABLES */ srvAddress = malloc(sizeof(char)*1024); srvAddress = "localhost"; reqRec = malloc(sizeof(char)*1024); sessionid = malloc(sizeof(char)*8); username = NULL; password = NULL; again = EVAL_FALSE; /* DEBUT */ do{ Welcome(); //Affichage de l'interface graphique //Initialisation de la connexion avec le serveur printf("Test de la connexion avec le serveur.\n"); if(Initialisation(srvAddress) != 1) { printf("Le serveur est hors ligne ...\n"); return EXIT_FAILURE; } else { printf("Le serveur est en ligne."); } //puts("Phase de test, on supprime le test de connexion au serveur."); printf("\n**************************************************************\n\n"); /* Saise des identifiants */ retour = DemandeID(&username, &password); if(retour != 0){ return EXIT_FAILURE; } //connectUser(&username, &password); /* Création de la requete de connexion */ strcat(requete,"CONNECT "); strcat(requete,username); strcat(requete," "); strcat(requete,password); strcat(requete,"\n"); printf("%s\n", requete); //Affichage de la requete envoyée /* Envoi des identifiants et récupération du session ID*/ if(Emission(requete)!=1) { printf("Erreur d'émission\n"); return 1; } /* Connexion au service, echec si le sessionID retourné est 1*/ reqRec = Reception(); get_word(reqRec, sessionid,2); printf("%s\n",reqRec ); if(cmp_word(sessionid,"1",1)){ printf("Erreur lors de la réception du session ID : val = %s\n", sessionid); return 1; } /* Traitement du choix de l'utilisateur */ do{ /* Proposition des différents cas et appel des fonctions correspondantes */ again = ChoiceScreen(username, sessionid); }while(again != EVAL_FALSE); }while(1); /* -------------------------------------------------- */ /* if(Emission("Test de req client1.\n")!=1) { printf("Erreur d'�mission\n"); return 1; } req = Reception(); if(req != NULL) { printf("J'ai recu: %s\n", req); free(req); } else { printf("Erreur de r�ception\n"); return 1; } req = Reception(); if(req != NULL) { printf("J'ai recu: %s\n", req); free(req); } else { printf("Erreur de r�ception\n"); return 1; } req = Reception(); if(req != NULL) { printf("J'ai recu: %s\n", req); free(req); } else { printf("Erreur de r�ception\n"); return 1; } Terminaison();*/ /* FIN */ return 0; }
/* Envoi une partie d'un fichier au client */ int envoyerPartieFichier(Client *client, char *requete){ FILE * fichier; /* Fichier que l'on veut envoyer */ char nomFichier[100]; /* Chemin du fichier que l'on veut envoyer */ char fichierSave[100]; /* Sauvegarde du nom du fichier car il s'efface au cours de l'execution */ char commande[5]; /* Commande de l'utilisateur */ int debut; /* Fin de la partie */ int fin; /* Debut de la partie */ char *reponse; /* Reponse pour le client */ char requeteSave[500]; /* Sauvegarde de la requete */ char donnees[8191]; /* Donnees du bloc */ char caractereCourrant; /* Caractere lu dans le fichier */ strcpy(requeteSave,requete); /* on recupere les elements presents dans la requete */ if(sscanf(requete,"%s %s %d %d",commande,nomFichier,&debut,&fin) < 1){ /* Erreur dans lecture chaine */ printf("Erreur lecture chaine\n"); Emission("451 - ERREUR decomposition de la requete echouee\n",client); return 0; }else{ /* on sauvegarde le nom du fichier */ strcpy(fichierSave,nomFichier); /* On verifie que la commande est bien REST */ if(strcmp(commande,"REST") != 0){ /* On envoie l'erreur au client */ printf("Requete incorrecte : mauvaise commande\n"); Emission("500 - Requete incorrecte\n",client); return 0; }else{ /* On teste que le chemin du fichier pas vide */ if(nomFichier == NULL || strcmp(nomFichier,"") == 0){ /* Erreur pas de chemin pour le fichier */ printf("ERREUR : Le chemin du fichier est vide\n"); Emission("501 - Chemin du fichier NULL ou vide\n",client); return 0; }else{ /* On teste maintenant la longueur de la requete */ /* On va donc comparer la requete sauvegardee a une requete que l'on monte pour le test */ sprintf(requete,"REST %s %d %d\n",nomFichier,debut, fin); if(strlen(requeteSave) != strlen(requete)){ /* requete incorrecte */ printf("Requete incorrecte : probleme de longueur\n"); Emission("500 - Requete incorrecte\n",client); return 0; }else{ /* On recupere le nom du fichier de la sauvegarde */ strcpy(nomFichier,fichierSave); /* On ouvre le fichier en mode binaire */ fichier = NULL; /* on met fichier a NULL pour bien pouvoir tester l'ouverture */ fichier = fopen(nomFichier,"rb"); /* On teste l'ouverture du fichier */ if(fichier == NULL){ /* Echec de l'ouverture */ printf("ERREUR : ouverture du fichier impossible\n"); Emission("550 - Impossible d'ouvrir le fichier\n",client); return 0; }else{ int nbCaractereLus; /* compteur du nombre total de caracteres lus */ int compteur; /* compteur pour le bloc */ /* On informe le client que le telechargement va commencer */ Emission("150 - Debut du telechargement\n",client); /* On positionne le compteur de caractere a 0 */ compteur = 0; nbCaractereLus = 0; /* On se positionne au bon endroit dans le fichier */ fseek(fichier,debut,SEEK_SET); /* On va lire le fichier caractere par caractere */ do{ /* On recupere le premier caractere */ caractereCourrant = fgetc(fichier); /* Si on a atteint la fin du fichier, on prepare le bloc et on envoie */ if(nbCaractereLus == fin){ unsigned char descripteur = 0; EmissionBinaire(&descripteur,1,client); unsigned short taille = htons(compteur); /* ntohs cote reception */ EmissionBinaire((char*)&taille,2,client); EmissionBinaire(donnees,compteur,client); reponse = Reception(client); if(strstr(reponse,"OK") == NULL){ printf("Erreur client\n"); return 0; } }else{ /* On ajoute le caractere a la partie des donnees du bloc */ donnees[compteur] = caractereCourrant; /* On incremente le compteur */ compteur++; nbCaractereLus++; /* Si le compteur atteint la taille du bloc, on prepare le bloc et on envoie le bloc */ if(compteur == 8191){ unsigned char descripteur = 0; EmissionBinaire(&descripteur,1,client); unsigned short taille = htons(8191); /* ntohs cote reception */ EmissionBinaire((char*)&taille,2,client); EmissionBinaire(donnees,8191,client); reponse = Reception(client); if(strstr(reponse,"OK") == NULL){ printf("Erreur client\n"); return 0; } /* On remet le compteur a 0 */ compteur = 0; } } }while(caractereCourrant != EOF); unsigned char descripteur = 64; EmissionBinaire(&descripteur,1,client); unsigned short taille = 0; /* ntohs cote reception */ EmissionBinaire((char*)&taille,2,client); /* On teste le retour client et on envoie le message correspondant */ if(strstr(Reception(client),"OK") != NULL){ /* Le retour client contient bien OK */ printf("Telechargement OK\n"); Emission("226 - Telechargement termine\n",client); }else{ printf("Telechargement KO\n"); Emission("451 - Telechargement echoue\n",client); } /* On quitte la fonction avec le code retour 1 */ return 1; } } } } } }
/* Envoi en mode bloc, retourne 1 si ok et 0 sinon */ int envoyerFichierBloc(Client *client, char *requete){ FILE * fichier; /* Fichier que l'on veut envoyer */ char *nomFichier; /* Chemin du fichier que l'on veut envoyer */ char *requeteSave; /* Sauvegarde de la requete client pour le test de longueur */ char fichierSave[100]; /* Sauvegarde du nom du fichier car il s'efface au cours de l'execution */ char *commande; /* Commande de l'utilisateur */ char caractereCourrant; /* Caractere lu dans le fichier */ int compteur; /* Compteur de caractere */ char donnees[8191]; /* Donnees du bloc */ char *retourClient; /* Reponse du client apres envoi d'un bloc */ char *tailleDejaRecue; /* Depart de la reprise */ /* On alloue de la memoire a la sauvegarde de la requete */ requeteSave = (char*) malloc(100); /* On sauvegarde la requete */ strcpy(requeteSave,requete); /* On decompose la requete client pour extraire le nom du fichier et la commande */ commande = strtok(requete, " \n"); nomFichier = strtok(NULL, " \n"); /* on sauvegarde le nom du fichier */ strcpy(fichierSave,nomFichier); /* On verifie que la commande est bien RETR */ if(strcmp(commande,"RETR") != 0){ /* On envoie l'erreur au client */ printf("Requete incorrecte : mauvaise commande\n"); Emission("500 - Requete incorrecte\n",client); return 0; }else{ /* On teste que le chemin du fichier pas vide */ if(nomFichier == NULL || strcmp(nomFichier,"") == 0){ /* Erreur pas de chemin pour le fichier */ printf("ERREUR : Le chemin du fichier est vide\n"); Emission("501 - Chemin du fichier NULL ou vide\n",client); return 0; }else{ /* On teste maintenant la longueur de la requete */ /* On va donc comparer la requete sauvegardee a une requete que l'on monte pour le test */ sprintf(requete,"RETR %s\n",nomFichier); if(strlen(requeteSave) != strlen(requete)){ /* requete incorrecte */ printf("Requete incorrecte : probleme de longueur\n"); Emission("500 - Requete incorrecte\n",client); return 0; }else{ /* On recupere le nom du fichier de la sauvegarde */ strcpy(nomFichier,fichierSave); /* On ouvre le fichier en mode binaire */ fichier = NULL; /* on met fichier a NULL pour bien pouvoir tester l'ouverture */ fichier = fopen(nomFichier,"rb"); /* On teste l'ouverture du fichier */ if(fichier == NULL){ /* Echec de l'ouverture */ printf("ERREUR : ouverture du fichier impossible\n"); Emission("550 - Impossible d'ouvrir le fichier\n",client); return 0; }else{ /* On informe le client que le telechargement va commencer */ Emission("150 - Debut du telechargement\n",client); /* On positionne le compteur de caractere a 0 */ compteur = 0; /* On va lire le fichier caractere par caractere */ do{ /* On recupere le premier caractere */ caractereCourrant = fgetc(fichier); /* Si on a atteint la fin du fichier, on prepare le bloc et on envoie */ if(caractereCourrant == EOF){ unsigned char descripteur = 0; EmissionBinaire(&descripteur,1,client); unsigned short taille = htons(compteur); /* ntohs cote reception */ EmissionBinaire((char*)&taille,2,client); EmissionBinaire(donnees,compteur,client); retourClient = Reception(client); if(strstr(retourClient,"OK") == NULL){ /* On regarde si le client demande la reprise */ if(strstr(retourClient,"REST") != NULL){ /* On recupere la taille deja recue */ tailleDejaRecue = (char*) malloc(strlen(retourClient)-6); int x; /* indice de parcours */ for(x=5;x<strlen(retourClient);x++){ tailleDejaRecue[x-5] = retourClient[x]; } /* On positionne le curseur dans le fichier a l'emplacement de la reprise */ fseek(fichier,atoi(tailleDejaRecue),SEEK_SET); }else{ printf("Erreur client\n"); return 0; } } }else{ /* On ajoute le caractere a la partie des donnees du bloc */ donnees[compteur] = caractereCourrant; /* On incremente le compteur */ compteur++; /* Si le compteur atteint la taille du bloc, on prepare le bloc et on envoie le bloc */ if(compteur == 8191){ unsigned char descripteur = 0; EmissionBinaire(&descripteur,1,client); unsigned short taille = htons(8191); /* ntohs cote reception */ EmissionBinaire((char*)&taille,2,client); EmissionBinaire(donnees,8191,client); retourClient = Reception(client); if(strstr(retourClient,"OK") == NULL){ /* On regarde si le client demande la reprise */ if(strstr(retourClient,"REST") != NULL){ /* On recupere la taille deja recue */ tailleDejaRecue = (char*) malloc(strlen(retourClient)-6); int x; /* indice de parcours */ for(x=5;x<strlen(retourClient);x++){ tailleDejaRecue[x-5] = retourClient[x]; } /* On positionne le curseur dans le fichier a l'emplacement de la reprise */ fseek(fichier,atoi(tailleDejaRecue),SEEK_SET); }else{ printf("Erreur client\n"); return 0; } } /* On remet le compteur a 0 */ compteur = 0; } } }while(caractereCourrant != EOF); unsigned char descripteur = 64; EmissionBinaire(&descripteur,1,client); unsigned short taille = 0; /* ntohs cote reception */ EmissionBinaire((char*)&taille,2,client); /* On teste le retour client et on envoie le message correspondant */ if(strstr(Reception(client),"OK") != NULL){ /* le retour client contient bien OK */ printf("Telechargement OK\n"); Emission("226 - Telechargement termine\n",client); }else{ printf("Telechargement KO\n"); Emission("451 - Telechargement echoue\n",client); } /* On quitte la fonction avec le code retour 1 */ return 1; } } } } }
/* Permet au serveur d'envoyer un fichier a un client qui en fait la demande */ int envoyerFichier(Client *client, char *requete){ char *requeteSave; /* sauvegarde de la requete passee en parametre */ char *nomFichier; /* nom du fichier a envoyer */ char *commande; /* commande de l'utilisateur */ FILE * fichier = NULL; /* fichier a envoyer */ char *contenuFichier; /* Contenu du fichier que l'on veut envoyer */ long taille; /* taille du fichier */ char fichierSave[100]; /* sauvegarde du nom du fichier */ char *resultatTelechargement; /* Ok ou KO en fonction du resultat du telechargement */ /* On alloue de la memoire a la sauvegarde de la requete */ requeteSave = (char*) malloc(100); /* On alloue de la memoire pour la variable */ resultatTelechargement = (char*) malloc(5); /* On sauvegarde la requete */ strcpy(requeteSave,requete); /* On decompose la requete client pour extraire le nom du fichier et la commande */ commande = strtok(requete, " \n"); nomFichier = strtok(NULL, " \n"); /* on sauvegarde le nom du fichier */ strcpy(fichierSave,nomFichier); /* On verifie que la commande est bien RETR */ if(strcmp(commande,"RETR") != 0){ /* On envoie l'erreur au client */ printf("Requete incorrecte : mauvaise commande\n"); Emission("500 - Requete incorrecte\n",client); return 0; }else{ /* On teste que le chemin du fichier pas vide */ if(nomFichier == NULL || strcmp(nomFichier,"") == 0){ /* Erreur pas de chemin pour le fichier */ printf("ERREUR : Le chemin du fichier est vide\n"); Emission("501 - Chemin du fichier NULL ou vide\n",client); return 0; }else{ /* On teste maintenant la longueur de la requete */ /* On va donc comparer la requete sauvegardee a une requete que l'on monte pour le test */ sprintf(requete,"RETR %s\n",nomFichier); if(strlen(requeteSave) != strlen(requete)){ /* requete incorrecte */ printf("Requete incorrecte : probleme de longueur\n"); Emission("500 - Requete incorrecte\n",client); return 0; }else{ /* On va maintenant ouvrir le fichier demande */ strcpy(nomFichier,fichierSave); /* on recupere la sauvegarde du nom du fichier */ /* Ouverture du fichier en mode lecture */ fichier = fopen(nomFichier,"rb"); /* On teste l'ouverture du fichier */ if(fichier == NULL){ /* Erreur ouverture fichier */ printf("ERREUR : ouverture du fichier impossible\n"); Emission("550 - Impossible d'ouvrir le fichier\n",client); return 0; }else{ /* on recupere le contenu du fichier */ /* On recupere la taille du fichier */ fseek (fichier , 0 , SEEK_END); taille = ftell (fichier); rewind (fichier); /* On alloue de la memoire pour le contenu du fichier */ contenuFichier = (char*) malloc(taille); /* on va maintenant lire le contenu du fichier */ if(fread(contenuFichier,1,taille,fichier)<1){ /* Erreur lecture fichier */ printf("ERREUR : lecture du fichier echouee\n"); /* on ferme le fichier */ fclose(fichier); Emission("550 - Impossible de lire le fichier\n",client); return 0; }else{ /* On teste que contenu fichier est non null */ if(contenuFichier == NULL){ /* Contenu fichier null */ printf("ERREUR : contenu du fichier null\n"); /* on ferme le fichier */ fclose(fichier); Emission("550 - Impossible de lire le fichier\n",client); return 0; }else{ /* on ferme le fichier */ fclose(fichier); /* On informe que le telechargement va debuter */ Emission("150 - Debut du telechargement\n",client); /* On envoie le contenu du fichier au client */ printf("Envoi du contenu fichier\n"); Emission(contenuFichier,client); printf("Telechargement OK\n"); /* On recupere la reponse avec le resultat du telechargement */ resultatTelechargement = Reception(client); if(strstr(resultatTelechargement,"OK") != NULL){ /* On envoie le message 226 */ Emission("226 - Telechargement termine\n",client); }else{ /* On envoie 451 */ Emission("451 - Telechargement echoue\n",client); } return 1; } } } } } } }
/* Permet au client d'envoyer un fichier sur le serveur, si le fichier est deja present sur le serveur on ecrase */ void recevoirFichier(Client *client, char *requete){ char *requeteSave; /* sauvegarde de la requete passee en parametre */ char *nomFichier; /* nom du fichier envoye par l'utilisateur */ char *commande; /* commande de l'utilisateur */ char fichierSave[100]; /* sauvegarde du nom du fichier */ /* On alloue de la memoire a la sauvegarde de la requete */ requeteSave = (char*) malloc(100); /* On sauvegarde la requete */ strcpy(requeteSave,requete); /* On decompose la requete client pour extraire le nom du fichier et la commande */ commande = strtok(requete, " \n"); nomFichier = strtok(NULL, " \n"); /* on sauvegarde le nom du fichier */ strcpy(fichierSave,nomFichier); /* On verifie que la commande est bien STOR */ if(strcmp(commande,"STOR") != 0){ /* On envoie l'erreur au client */ printf("Requete incorrecte : mauvaise commande\n"); Emission("500 - Requete incorrecte\n",client); }else{ /* On teste que le chemin du fichier pas vide */ if(nomFichier == NULL || strcmp(nomFichier,"") == 0){ /* Erreur pas de chemin pour le fichier */ printf("ERREUR : Le chemin du fichier est vide\n"); Emission("501 - Chemin du fichier NULL ou vide\n",client); }else{ /* On teste maintenant la longueur de la requete */ /* On va donc comparer la requete sauvegardee a une requete que l'on monte pour le test */ sprintf(requete,"STOR %s\n",nomFichier); if(strlen(requeteSave) != strlen(requete)){ /* requete incorrecte */ printf("Requete incorrecte : probleme de longueur\n"); Emission("500 - Requete incorrecte\n",client); }else{ /* On demande maintenant le contenu du fichier au client */ Emission("150 - Transfert autorise\n",client); char *contenuFichier = NULL; contenuFichier = Reception(client); /* On teste que le contenu a bien ete recu */ if(contenuFichier == NULL){ printf("ERREUR : probleme reception contenu fichier\n"); Emission("451 - Erreur avec l'envoi du fichier\n",client); }else{ /* On va maintenant cree le fichier */ FILE * fichier = NULL; /* Fichier dans lequel on va ecrire */ strcpy(nomFichier,fichierSave); /* on recupere la sauvegarde du nom du fichier */ fichier = fopen(nomFichier,"wb"); /* On teste la creation/ouverture du fichier */ if(fichier == NULL){ /* Probleme creation fichier */ printf("ERREUR : creation fichier KO\n"); Emission("451 - Erreur avec la creation du fichier sur le serveur\n",client); }else{ printf("%s\n",contenuFichier); /* On va maintenant ecrire le contenu dans la fichier */ if(fwrite(contenuFichier,strlen(contenuFichier),1,fichier) < 1){ /* Erreur ecriture du fichier */ printf("ERREUR : ecriture fichier KO\n"); /* on ferme le fichier */ fclose(fichier); Emission("451 - Erreur avec l'ecriture dans le fichier sur le serveur\n",client); }else{ /* Si tout c'est bien on informe l'utilisateur */ printf("Transfert du fichier OK\n"); /* on ferme le fichier */ fclose(fichier); Emission("226 - Transfert du fichier termine\n",client); } } } } } } }
int main(int argc, char *argv[]) { char requete[100]; /* requete que l'on va envoyer au serveur */ int etatConnexion; /* 1 : connecte / 0 : non connecte */ int choix; /* Choix pour le menu principal */ char nomFichier[100]; /* Nom du fichier */ int c; /* permet de vider le buffer */ int termine; /* permet de savoir si un client a termine ses traitements */ int choixModeTransfert; /* Mode de transfert du fichier, 0 = bloc / 1 = flux */ etatConnexion = 0; choixModeTransfert = 1; /* Mode flux par defaut */ /* On initialise le client */ if(InitialisationAvecService(argv[1],argv[2]) == 0){ /* Erreur sur l'initialisation, message d'erreur affiche par la fonction */ return -1; } /* On se connecte directement sur le serveur */ etatConnexion = connecterUtilisateur(); /* On verifie que l'utilisateur est bien connecte sur le serveur */ if(etatConnexion == 1){ /* On va maintenant afficher le menu principal de l'application */ do{ termine = FALSE; /* Menu principal */ printf("-MENU PRINCIPAL-\n\n"); printf("1 : Envoyer un fichier sur le serveur\n"); printf("2 : Telecharger un fichier stocke sur le serveur\n"); printf("3 : Modifier le mode de telechargement des fichiers (bloc / flux)\n"); printf("4 : Reprendre un telechargement en cours (suite a une erreur)\n"); printf("0 : Se deconnecter\n\n"); printf("Votre choix : "); /* On recupere le choix de l'utilisateur */ if(scanf("%d",&choix) < 1){ /* Erreur saisie */ printf("ERREUR : votre saisie est incorrecte \n\n"); while ( ((c = getchar()) != '\n') && c != EOF); /* on vide le buffer */ }else{ while ( ((c = getchar()) != '\n') && c != EOF); /* on vide le buffer */ /* On regarde le choix de l'utilisateur */ switch (choix){ case 1: /* Envoyer un fichier */ printf("Saisir le nom du fichier que vous voulez envoyer (le fichier doit se trouver dans le repertoire actuel et le nom doit faire 100 caracteres max) : \n"); /* On va lire le nom du fichier au clavier */ fgets(nomFichier,100,stdin); fflush(stdin); /* on vide le buffer */ /* On verifie que on a bien lu quelque chose */ if(nomFichier != NULL){ /* On lance la procedure d'envoi */ envoyerFichier(nomFichier); } break; case 2: /* Telecharger un fichier */ printf("Saisir le nom du fichier que vous voulez telecharger : \n"); /* On va lire le nom du fichier au clavier */ fgets(nomFichier,100,stdin); fflush(stdin); /* on vide le buffer */ /* On verifie qu'on a bien lu quelque chose */ if(nomFichier != NULL){ /* En fonction du mode on appelle la fonction qui correspond */ if(choixModeTransfert == 0){ /* On regarde si le client est lance avec plusieurs serveurs <=> nb arguments > 2 */ if(argc > 3){ /* on va pouvoir faire du telechargement parallele */ pthread_t tabThread[argc-2]; /* Tableau de thread de longueur = au nombre de serveurs */ int i; /* indice de parcours du tableau */ /* On boucle pour creer les threads */ for(i=0;i<argc-2;i++){ donneesThread *donnees = malloc(sizeof(donneesThread)); strcpy(donnees->numPort,argv[i+2]); strcpy(donnees->nomFichier,nomFichier); donnees->numeroServeur = i+1; donnees->nombreServeurs = argc-2; pthread_create(&tabThread[i], NULL, telechargerFichierBlocThread,(void *) donnees); } /* On boucle pour mettre le programme en attente */ for(i=0;i<argc-2;i++){ pthread_join(tabThread[i], NULL); } }else{ /* On telecharge normal depuis un seul serveur */ telechargerFichierBloc(nomFichier); } }else{ /* On lance la procedure d'envoi */ telechargerFichier(nomFichier); } } break; case 3: /* Modification du mode de transfert */ do{ printf("Quel mode de transfert voulez-vous choisir :\n"); printf("1 : Mode bloc\n"); printf("2 : Mode flux\n"); printf("0 : Retour\n"); printf("Votre choix : "); if(scanf("%d",&choixModeTransfert) < 1){ /* Erreur saisie */ printf("ERREUR : votre saisie est incorrecte \n\n"); while ( ((c = getchar()) != '\n') && c != EOF); /* on vide le buffer */ }else{ while ( ((c = getchar()) != '\n') && c != EOF); /* On teste que l'utiliateur est bien saisi 1 ou 2 ou 0 */ switch (choixModeTransfert){ case 1: /* Passage en mode bloc */ changerMode('B'); choixModeTransfert = 0; break; case 2: /* Passage en mode flux */ changerMode('S'); choixModeTransfert = 1; break; default: /* Erreur saisie */ printf("Votre choix est incorrect\n"); } } }while(choixModeTransfert != 0 && choixModeTransfert != 1); break; case 4: printf("Saisir le nom du fichier que vous voulez reprendre : \n"); /* On va lire le nom du fichier au clavier */ fgets(nomFichier,100,stdin); fflush(stdin); /* on vide le buffer */ /* On verifie qu'on a bien lu quelque chose */ if(nomFichier != NULL){ /* On passe en mode bloc */ choixModeTransfert = 0; /* On reprend le transfert */ repriseTelechargement(nomFichier); } break; case 0: /* Quitter l'application */ Emission("QUIT\n"); printf("%s",Reception()); Terminaison(); termine = TRUE; break; default: /* Erreur saisie */ printf("ERREUR : votre saisie est incorrecte \n\n"); break; } } }while(termine != TRUE); /* On ferme l'application */ printf("Fin du programme, au revoir\n"); } return 0; }