/* Change le mode de transfert des fichier, retourne NULL si KO ou le codeMode si OK */ char changerMode(char *requete, Client *client){ char mode; /* code pour le mode demande */ /* On recupere dans la requete le caractere correspondant au mode, si la requete est bien formee c'est le 6eme caractere, S = flux et B = bloc */ mode = requete[5]; /* On teste que le mode demande est bien correct */ if(mode == 'B' || mode == 'S'){ /* Le mode est correct on teste maintenant la longueur de la requete, typiquement MODE CODE\n => 7 caracteres */ if(strlen(requete) == 7){ printf("%s\n",extraireSousChaine(requete, 5, 0)); /* Requete correcte, on teste maintenant la commande */ if(strcmp(extraireSousChaine(requete, 5, 0),"MODE ") == 0){ /* La commande est correcte on retourne le nouveau mode */ Emission("200 - Changement de mode de transfert termine\n",client); return mode; }else{ /* Erreur commande incorrecte */ Emission("500 - Commande inconnue\n",client); return 0; } }else{ /* Longueur de requete incorrecte */ Emission("500 - Erreur de syntaxe dans la requete, longueur incorrecte\n",client); return 0; } }else{ /* Mode incorrect */ Emission("501 - Le mode demande est incorrect\n",client); return 0; } }
/* 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; } } } }
/* * Création de la requete d'ajout utilisateur * Renvoi 1 si echec, 0 sinon */ int addUtilisateur(){ char* login=NULL; // Entrer par l'utilisateur char* password=NULL; // Entrer par l'utilisateur char* requete=NULL; // Allocation de la mémoire pour les chaines login = malloc((size_t)50); // (size_t) 50 caractères me parrait suffisant pour un login et mdp password = malloc((size_t)50); requete = malloc((size_t)100); // Phase utilisateur printf("Entrer le login du nouvel utilisateur : "); fgets(login, 50,stdin); password = getpass("Entrer son mot de passe : "); // Permet de cacher les caractères tapés requete = creationRequete("ADD_USER", login, password); if(Emission(requete) == 0){ printf("TEST - Erreur lors de l'envoi de la requete d'ajout utilisateur"); return 1; } return 0; }
void gererEmission(char nomFichier[50]) { printf("Emission du fichier %s ToDo\n", nomFichier); nomFichier[strlen(nomFichier)]='\n'; Emission(nomFichier); }
int connexion(){ int resCo = 0; char* login=NULL; // Entrer par l'utilisateur char* password=NULL; // Entrer par l'utilisateur char* requete_temp=NULL; char* requete=NULL; // Allocation de la mémoire pour les chaines login = malloc((size_t)50); // (size_t) 50 caractères me parrait suffisant pour un login et mdp password = malloc((size_t)50); requete_temp = malloc((size_t)100); requete = malloc((size_t)100); // Phase utilisateur printf("Entrer votre login : "******"Mot de passe : "); // Permet de cacher les caractères tapés // Préparation de la chaine login login[strlen(login)-1] = '\0'; // Création de la requête à emettre au serveur => A mettre avec la fonction creation requete requete = strcat(requete,"CON_USER \0"); requete_temp = strcat (login, " "); requete_temp = strcat(requete_temp, password); requete = strcat(requete, requete_temp); // Préparation de la chaine requete à l'emission => Verification : Requete OK requete[strlen(requete)]='\n'; // Emission de la requete de connexion au serveur if(Emission(requete)==0){ perror("\nErreur lors de l'emission de la requete de connexion"); } /* printf("Avant les free"); */ /* if(login != NULL ){ */ /* free(login); */ /* login = NULL; */ /* } */ /* if(password != NULL){ */ /* free(password); */ /* password = NULL; */ /* } */ /* if(requete_temp != NULL){ */ /* free(requete_temp); */ /* requete_temp = NULL; */ /* } */ /* if(requete != NULL){ */ /* free(requete); */ /* requete = NULL; */ /* } */ return resCo = 0; }
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; }
//---------------------------------------------------------------------------------------------------- int main(void) { Initialization_All(); uint8_t pat_count, counter1, meandre_ok = 0; SysTick_Config(SystemCoreClock / 1000);//200000 if (Button_test() == false) state_err[4] = 0x04; //button on test if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0) state_err[6] = 0x06; //LV1 error if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) state_err[8] = 0x08; //LV2 error if (meandr_test(GPIOB, GPIO_Pin_0) == true) state_err[7] = 0x07; //short-circuit K1 if (meandr_test(GPIOB, GPIO_Pin_1) == true) {state_err[9] = 0x09; //emission in process \/ monoblok isn't connected Emission(true); Beeper(true);} //вкл индикатор излучение, вкл бипер Display(&display, struct_sample.voltage_correction*struct_sample.man_exposition*20);//длительность экспозиции мс //main loop while(1) { wait_label: // while B_SAFE and B_FILM is ON, do get voltage and output to display if (Button_OnClick(B_SAFE) && Button_OnClick(B_FILM)) { DI_Display(&display, readADC1(), 0); } meandr_auto(); // Выбор пациента if(Button_OnClick(B_PAT) == 1) ++pat_count; if (pat_count > 3) pat_count = 1; switch(pat_count) { case 1: {GPIO_SetBits(GPIOB, GPIO_Pin_3); GPIO_ResetBits(GPIOD, GPIO_Pin_6); GPIO_ResetBits(GPIOD, GPIO_Pin_4); \ DI_Display(&display, 3, 0);\ struct_sample.patient_type = PAT1;} break; case 2: {GPIO_ResetBits(GPIOB, GPIO_Pin_3); GPIO_SetBits(GPIOD, GPIO_Pin_6); GPIO_ResetBits(GPIOD, GPIO_Pin_4);\ DI_Display(&display, 33, 0);\ struct_sample.patient_type = PAT2;} break; case 3: {GPIO_ResetBits(GPIOB, GPIO_Pin_3); GPIO_ResetBits(GPIOD, GPIO_Pin_6); GPIO_SetBits(GPIOD, GPIO_Pin_4);\ DI_Display(&display, 111, 0);\ struct_sample.patient_type = PAT3;} break; default:{GPIO_ResetBits(GPIOB, GPIO_Pin_3); GPIO_ResetBits(GPIOD, GPIO_Pin_6); GPIO_ResetBits(GPIOD, GPIO_Pin_4);} break; } //Выбор пленки if(Button_OnClick(B_FILM) == 1) ++film_count; if (film_count > 3) film_count = 1; switch(pat_count) { case 1: {GPIO_SetBits(GPIOA, GPIO_Pin_15); GPIO_ResetBits(GPIOA, GPIO_Pin_13); GPIO_ResetBits(GPIOA, GPIO_Pin_9);\ struct_sample.film = FILM_1;} break; case 2: {GPIO_ResetBits(GPIOA, GPIO_Pin_15);GPIO_SetBits(GPIOA, GPIO_Pin_13); GPIO_ResetBits(GPIOA, GPIO_Pin_9);\ struct_sample.film = FILM_2;} break; case 3: {GPIO_ResetBits(GPIOA, GPIO_Pin_15);GPIO_ResetBits(GPIOA, GPIO_Pin_13); GPIO_SetBits(GPIOA, GPIO_Pin_9);\ struct_sample.film = FILM_3;} break; default:{GPIO_ResetBits(GPIOA, GPIO_Pin_15);GPIO_ResetBits(GPIOA, GPIO_Pin_13); GPIO_ResetBits(GPIOA, GPIO_Pin_9);} break; } // Кнопка безопасности if(Button_OnClick(B_SAFE) == 1) { if (!b_Safe) { GPIO_SetBits(GPIOC, GPIO_Pin_9); b_Safe = 1;// safe } else if(b_Safe) { GPIO_ResetBits(GPIOC, GPIO_Pin_9); b_Safe = 0;// safe } } //buttons released Button_OnClick(B_EXP)? (b_Exp = 1):(b_Exp = 0); Button_OnClick(B_PLUS)? (b_Plus = 1):(b_Plus = 0); Button_OnClick(B_MINUS)?(b_Minus = 1):(b_Minus = 0); Button_OnClick(B_FILM)? (b_Film = 1):(b_Film = 0); Button_OnClick(B_UIN)? (b_Uin = 1):(b_Uin = 0); /*if (Button_OnClick(B_EXP) == 1) b_Exp = 1; if (Button_OnClick(B_PLUS) == 1) b_Plus = 1; if (Button_OnClick(B_MINUS) == 1) b_Minus = 1; if (Button_OnClick(B_FILM) == 1) b_Film = 1; if (Button_OnClick(B_UIN) == 1) b_Uin = 1; */ //Выбор зуба if (Button_OnClick(B_UPM) == 1){ TOOTH_IND_ON('upm') ; struct_sample.tooth = UPM; } if (Button_OnClick( B_UMO) == 1){ TOOTH_IND_ON('umo') ; struct_sample.tooth = UMO; } if (Button_OnClick(B_DIN) == 1){ TOOTH_IND_ON('din') ; struct_sample.tooth = DIN; } if (Button_OnClick(B_DPM) == 1){ TOOTH_IND_ON('dpm') ; struct_sample.tooth = DPM; } if (Button_OnClick(B_UIN) == 1){ TOOTH_IND_ON('uin') ; struct_sample.tooth = UIN; } if (Button_OnClick(B_DMO) == 1){ TOOTH_IND_ON('dmo') ; struct_sample.tooth = DMO; } //==================================================================================== // starting mode //==================================================================================== if (mode_emit == starting) { //ошибка при преждевременном отпускании кнопки экспозиции if (Button_OnClick(B_EXP) == 1){ uint8_t i = 0; for(i = 0; i <= 5; i++){ voltage += readADC1(); delay_ms(20); } if ((voltage = voltage/i) < 2)//volt < 192V {state_err[1] = 0x01; mode_emit = idle; goto wait_label;} if ((voltage = voltage/i) > 3)//volt > 247V {state_err[2] = 0x02; mode_emit = idle; goto wait_label;} delay_ms(100); if (meandr_test(GPIOB, GPIO_Pin_0) == false) {state_err[1] = 0x01; mode_emit = idle; goto wait_label;} if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) {state_err[6] = 0x06; mode_emit = idle; goto wait_label;} if (meandr_test(GPIOB, GPIO_Pin_1) == 1) {state_err[9] = 0x09; mode_emit = idle; Emission(true); Beeper(true);}//light ON, beeper ON if ((GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 1)&(meandr_test(GPIOB, GPIO_Pin_0) == true)) {mode_emit = emit;} } } // starting mode if (mode_emit == emit) { Display(&display, struct_sample.voltage_correction); if (cntr_imp >= imp_len) { // stopEmission(); mode_emit = idle; goto wait_label; } } }//while(1) }//main()
/* 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; } } } } } }
/* Renvoi au client la taille du fichier qu'il donne en parametre */ int tailleFichier(char *requete, Client *client){ 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 */ long taille; /* Taille du fichier */ char reponse[100]; /* Reponse pour le client */ /* 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 SIZE */ if(strcmp(commande,"SIZE") != 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,"SIZE %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 recupere la taille du fichier */ fseek (fichier , 0 , SEEK_END); taille = ftell (fichier); rewind (fichier); /* On envoi la taille du fihier */ sprintf(reponse,"213 %ld\n",taille); Emission(reponse,client); printf("Taille du fichier envoyee\n"); 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; }