Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
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;
			}
		}
	}
	
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
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;
					}
				}
			}
		}
	}
}
Ejemplo n.º 6
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;
				}
			}
		}
	}
}
Ejemplo n.º 7
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;
						}
					}
				}
			}
		}
	}
}
Ejemplo n.º 8
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;

}