Пример #1
0
/* 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;
	}
}
Пример #2
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;
			}
		}
	}
	
}
Пример #3
0
/*
 * 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;
}
Пример #4
0
void gererEmission(char nomFichier[50]) {
  
 	printf("Emission du fichier %s ToDo\n", nomFichier);
	nomFichier[strlen(nomFichier)]='\n';
	Emission(nomFichier);
	
}
Пример #5
0
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;
}
Пример #6
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;
}
Пример #7
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()
Пример #8
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;
					}
				}
			}
		}
	}
}
Пример #9
0
/* 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;
				}
			}
		}
	}
}
Пример #10
0
/* 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;
				}
			}
		}
	}
}
Пример #11
0
/* 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;
						}
					}
				}
			}
		}
	}
}
Пример #12
0
/* 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;

}