Bonjours
J'ai un petit soucie avec la fonction recv, explication:
J'ai un tableau de socket clients en global (dans un fichier serveur.c)
j'ai 1 recv dans une 1ere fonction "gestion_client"
j'ai 1 recv dans une 2eme fonction récursive
quand un client envoi des donnée et que le recv() de la 1ere fonction est en mode attente cela fonction très bien.
A un temps T, la fonction 1 appel la fonction 2
- le client envoi alors d'autre information mais la fonction 2 ne reçois rien ...
- a la fin de la fonction 2, la fonction 1 afficher TOUTES les infos que le client a envoyer (en 1 seul affichage) lorsque la fonction 2 était en mode recv()
j'ai fait plein de test j'ai vérifier mes recv() et mes send(), la taille des buffer mais rien n'y fait :/
donc si quelqu'un pouvait me dire pourquoi ou me donnée des piste sa serai cool![]()
Merci
code de la fonction 1:
code de la fonction 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136 void *gestionClient(void *idC) { 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]); if(strcmp(tab_mot[0], "DECO") == 0) { doneC = 0; } else if(strcmp(tab_mot[0], "PSEUDO") == 0) { strcpy(pseudo,tab_mot[1]); sprintf(chemin_dos,"CustomerBox/%s",pseudo); if(access(chemin_dos,0) == -1) { mkdir(chemin_dos,0777); printf("-> Le dossier '%s' a été créé ! \n",pseudo); } } else if(strcmp(tab_mot[0], "CREA-MAJ") == 0) { memset(chemin_dos,'\0',2048); strcpy(chemin_dos,tab_mot[2]); if(strcmp(tab_mot[1], "D") == 0) { sprintf(bufWrite,"Dossier : %s ---> Modification\n",chemin_dos); if(access(chemin_dos,0) == -1) { mkdir(chemin_dos,0777); //Envoi de l'Opperation Effectuée if(send(tab_c[id]->sockClient,"CREA",strlen("CREA"),0) == -1) { perror("***Probleme d'envoi du message de l'opperation effectuée au client***"); doneC = 0; } sprintf(bufWrite,"Dossier : %s ---> Creation\n",chemin_dos); } } else if(strcmp(tab_mot[1], "F") == 0) { if((f = fopen(chemin_dos, "r")) == NULL) { f = fopen(chemin_dos, "w+t"); //Envoi de l'Opperation Effectuée if(send(tab_c[id]->sockClient,"CREA",strlen("CREA"),0) == -1) { perror("***Probleme d'envoi du message de l'opperation effectuée au client***"); doneC = 0; } sprintf(bufWrite,"Fichier : %s ---> Creation",chemin_dos); } else { fclose(f); f = fopen(chemin_dos, "w"); //Envoi de l'Opperation Effectuée if(send(tab_c[id]->sockClient,"MODIF",strlen("MODIF"),0) == -1) { perror("***Probleme d'envoi du message de l'opperation effectuée au client***"); doneC = 0; } sprintf(bufWrite,"Fichier : %s ---> Modification",chemin_dos); } fclose(f); } //Envoi de l'Opperation Effectuée if(send(tab_c[id]->sockClient,bufWrite,strlen(bufWrite),0) == -1) { perror("***Probleme d'envoi du message de l'opperation effectuée au client***"); doneC = 0; } } else if(strcmp(tab_mot[0], "SUP") == 0) { sprintf(chemin_dos,"CustomerBox/%s",pseudo); if(parcoure_directory(id, chemin_dos) == -1) doneC = 0; sleep(1); //permet au client davoir le temps de ce metre en mode reception 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); } printf("\n**Un Client vien de ce deco !**\n"); for(doneC = 0; tab_mot[doneC] != NULL; doneC++) free(tab_mot[doneC]); free(tab_mot); close(tab_c[id]->sockClient); tab_c[id]->idClient = -1; return NULL; }
Si des erreur ou des absurdité vous pique l’œil merci de me le dire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 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) { 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) remove(chm); sleep(1); } 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) { 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) if(remove_directory(chm) == -1) return -1; sleep(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; }![]()
Partager