Comportement Inattendu fonction recv() [en C]

zelosien Messages postés 42 Date d'inscription   Statut Membre Dernière intervention   -  
zelosien Messages postés 42 Date d'inscription   Statut Membre Dernière intervention   -
Bonjours, j'ai un problème dans mon code :/

Pour un projet je doit refaire les bases de dropbox

j'ai donc un serveur qui:

- accepte un client et crée un thread pour lui

- recois des infos de la part du client pour la création et la mise a jour de son dossier

- pour la partie suppression des fichier j'utilise une fonction récursive qui va parcourir chaque dossier et envoyer au client le chemin de chaque fichier et chaque dossier 1 par 1.
Le client lui répond simplement OUI (si le fichier/dossier existe) ou NON (si le fichier/dossier)
n'existe pas.

le problème est que a ce moment là, le serveur est en recv mais il ne reçois absolument rien, il ne m'affiche le nombre de OUI et NON que a la fin (dans la fonction qui a appelée cette fonction récursive)

et je ne comprend pas pourquoi :/

voici une partie du code du serveur car après de nombreux test je suis sur que le problème viens du serveur

Fonction qui gere les demande des clients:
void *gestionClient(void *idC) //la fonction appelé par le thread
{
	char **tab_mot=NULL;	//tableau qui contien des mot split avec un delimiteur
	
	char bufRead[1024];			// Buffer de Lecture
		memset(bufRead,'\0',1024);
    char bufWrite[1024];				// Buffer d'Ecriture
		memset(bufWrite,'\0',1024);
    
    int id = (int)idC;	        // id du client
    char pseudo[64];		// pseudo du client

    char chemin_dos[2048]; 		// "CustomerBox/PSEUDO/..."
    FILE *f;					// fichier courant
    
 int doneC = 1;
while(doneC)
{
	// reception de la chaine de caracteres 
	if(recv(tab_c[id]->sockClient,bufRead,1024,0) == -1)
	{
		doneC = 0;
		close(tab_c[id]->sockClient);
		tab_c[id]->idClient = -1;
	}
	
	// cherche les mots
	tab_mot = split(bufRead, ":");
	printf("-%s-\n",tab_mot[0]); <----- affiche -SUP- et -OUINONNONOUI-
		
	if(strcmp(tab_mot[0], "DECO") == 0)
	{
	        doneC = 0;
	}	
	else if(strcmp(tab_mot[0], "SUP") == 0)
	{
		sprintf(chemin_dos,"CustomerBox/%s",pseudo);
		if(parcoure_directory(id, chemin_dos) == -1) <-- appel de la fonction recursive
			doneC = 0;
			
		if(send(tab_c[id]->sockClient,"FIN",strlen("FIN"),0) == -1)
		{
			perror("***Probleme d'envoi du message de FIN au client***");
			doneC = 0;
		}
	}
		
	memset(bufRead,'\0',1024);
	memset(bufWrite,'\0',1024);
 }
}


Fonction recursive:
int parcoure_directory(int id, char const *name)
{
    DIR *directory;           /* pointeur de répertoire */
    struct dirent *entry;     /* représente une entrée dans un répertoire. */
    struct stat file_stat;    /* informations sur un fichier. */

    /* Ce tableau servira à stocker le chemin d'accès complet
     * des fichiers et dossiers. Pour simplifier l'exemple,
     * je le définis comme un tableau statique (avec une taille
     * a priori suffisante pour la majorité des situations),
     * mais on pourrait l'allouer dynamiquement pour pouvoir
     * le redimensionner si jamais on tombait sur un chemin
     * d'accès démesurément long. */
    char chm[2048];
    memset(chm,'\0',2048);
    char dmd[2048];
    memset(dmd,'\0',2048);
	char rep[2048];
	memset(rep,'\0',2048);	

    /* On ouvre le dossier. */
    directory = opendir(name);
    if ( directory == NULL ) 
    {
        fprintf(stderr, "Ouvertur directory -> %s --- IMPOSSIBLE\n", name);
        return -1;
    }

    /* On boucle sur les entrées du dossier. */
    while ( (entry = readdir(directory)) != NULL ) 
    {
        /* On "saute" les répertoires "." et "..". */
        if ( strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0 )
            continue;

        /* On construit le chemin d'accès du fichier en
         * concaténant son nom avec le nom du dossier
         * parent. On intercale "/" entre les deux.
         * NB: '/' est aussi utilisable sous Windows
         * comme séparateur de dossier. */
        snprintf(chm, 2048, "%s/%s", name, entry->d_name);

        /* On récupère des infos sur le fichier. */
        if((stat(chm, &file_stat)) == -1) 
	{
		perror("***Probleme dans le stat***\n");
		return -1;
	}

        if ( S_ISREG(file_stat.st_mode) ) 
        {
		/* On est sur un fichier, on envoi les info. */
		snprintf(dmd, 2048, "F:%s", chm);
			
		if(send(tab_c[id]->sockClient,dmd,strlen(dmd),0) == -1)
		{
			perror("***Probleme dans l'envoi du chemin du FICHIER***\n");
			return -1;
		}
			
		// Reception de l'Opperation Effectuée
		if(recv(tab_c[id]->sockClient,rep,strlen(rep),0) == -1) <- recois chaine vide !!
		{
			perror("***Probleme dans la reception de l'opperation effectuer -FICHIER-***\n");
			return -1;
		}
			
		printf("F chm = -%s- || rep = -%s-\n",chm,rep);
		//si le fichier n'existe pas on le supprime
		if(strcmp(rep, "NON") == 0) <--- comme rep est vide rien ne se fait
			remove(chm);
        }
        else if ( S_ISDIR(file_stat.st_mode) ) 
        {
            /* On est sur un dossier, on envoi les info et on appelle cette fonction. */
            snprintf(dmd, 2048, "D:%s", chm);
            
		if(send(tab_c[id]->sockClient,dmd,strlen(dmd),0) == -1)
		{
			perror("***Probleme dans l'envoi du chemin du DOSSIER***\n");
			return -1;
		}
            
            // Reception de l'Opperation Effectuée
		if(recv(tab_c[id]->sockClient,rep,strlen(rep),0) == -1) <- recois chaine vide !!
		{
			perror("***Probleme dans la reception de l'opperation effectuer -DOSSIER-***\n");
			return -1;
		}
			
		printf("F chm = -%s- || rep = -%s-\n",chm,rep);
		//si le dossier n'existe pas on le supprime et egalement tout ce quil y avait dedant
		if(strcmp(rep, "NON") == 0) <--- comme rep est vide rien ne se fait
			if(remove_directory(chm) == -1)
				return -1;
            parcoure_directory(id, chm);
        }
       
        memset(chm,'\0',2048);
        memset(dmd,'\0',2048);
	memset(rep,'\0',2048);
    }

    /* On ferme le dossier. */
    closedir(directory);
    
    return 1;
}

1 réponse

zelosien Messages postés 42 Date d'inscription   Statut Membre Dernière intervention   1
 
up pls
0