/* 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; } } } } } }
void menuConnex() { size_t fin=0;//boolean de fin de boucle char choix[2];//recupere le choix de l'utilisateur int retour;//retour de fonction char idUtilisateur[6];//l'identifiant de l'utilisateur while(!fin) { printf("-------Menu-------\n"); printf("1)Authentification\n2)Création de compte\n0)quitter\n"); printf("choix: "); if(fgets(choix,2,stdin)==NULL) { perror("probleme dans l'entrée choix\n"); exit(1); // on quitte le programme } supprCara(choix);// on suppr le \n et on vide le buffer switch(choix[0]) { case '1': retour = authentification(idUtilisateur); if(retour==1) { printf("****connexion****\n"); menuUtilisateur(idUtilisateur); } else if(retour==0) { printf("L'identifiant et le mot de passe entrés par l'utilisateur ne sont pas corrects.\n"); } else { printf("Le serveur a rencontré un problème.\n"); } break; case '2': retour=creationDeCompte(); if(retour==1) { printf("Fin de l'enregistrement.\n"); } else if(retour==0) { printf("les informations sont incorrectes.\n"); } else { printf("Le serveur a rencontré un problème, veuillez recommencer.\n"); } break; case '0': EmissionBinaire("Deco\n",5); fin=1; break; default: printf("Erreur dans le choix, recommencez.\n"); break; } } return; }
/* 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; } } } } }