Comportement Inattendu fonction recv() [en C]
zelosien
Messages postés
50
Statut
Membre
-
zelosien Messages postés 50 Statut Membre -
zelosien Messages postés 50 Statut Membre -
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
- Fonction remplacer sur word - Guide
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel