Пример #1
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;
					}
				}
			}
		}
	}
}
Пример #2
0
void menuConnex()
{
    size_t fin=0;//boolean de fin de boucle
    char choix[2];//recupere le choix de l'utilisateur
    int retour;//retour de fonction
    char idUtilisateur[6];//l'identifiant de l'utilisateur

    while(!fin)
    {
        printf("-------Menu-------\n");
        printf("1)Authentification\n2)Création de compte\n0)quitter\n");
        printf("choix: ");

        if(fgets(choix,2,stdin)==NULL)
        {
            perror("probleme dans l'entrée choix\n");
            exit(1); // on quitte le programme
        }

        supprCara(choix);// on suppr le \n et on vide le buffer
        switch(choix[0])
        {
        case '1':
            retour = authentification(idUtilisateur);
            if(retour==1)
            {
                printf("****connexion****\n");
                menuUtilisateur(idUtilisateur);
            }
            else if(retour==0)
            {
                printf("L'identifiant et le mot de passe entrés par l'utilisateur ne sont pas corrects.\n");
            }
            else
            {
                printf("Le serveur a rencontré un problème.\n");
            }
            break;
        case '2':
            retour=creationDeCompte();
            if(retour==1)
            {
                printf("Fin de l'enregistrement.\n");
            }
            else if(retour==0)
            {
                printf("les informations sont incorrectes.\n");
            }
            else
            {
                printf("Le serveur a rencontré un problème, veuillez recommencer.\n");
            }
            break;
        case '0':
            EmissionBinaire("Deco\n",5);
            fin=1;
            break;
        default:
            printf("Erreur dans le choix, recommencez.\n");
            break;
        }
    }
    return;
}
Пример #3
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;
				}
			}
		}
	}
}