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 -
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:
Fonction recursive:
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; }
A voir également:
- Comportement Inattendu fonction recv() [en C]
- Fonction si et - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Virginie organise un rallye avec 30 équipes. elle veut créer un code pour désigner chaque équipe. elle a commencé à la main, mais elle voudrait le faire calculer à l'aide d'une formule. proposez une formule comportant une seule fonction et à recopier vers le bas dans la colonne a du fichier à télécharger. quelle formule sera en a9 ? ✓ - Forum Excel
- Fonction remplacer sur word - Guide