Bonjour,
je dois réaliser un serveur de fichiers. Pour celà j'ai opté pour créer un thread spécifique à chaque client qui se connecte. Dans ce thread le serveur initialise une deuxieme connection TCP qui permettra le transferts des fichiers. Cependant j'ai un souci au niveau du passage de paramètre. Je fais un affichage de la struct sockaddr du client dans le main puis lorsque je fais le meme affichage dans le thread les données sont différentes. Exemple :
/\/\/\ SERVEUR FTP LANCE /\/\/\
NOUVEAU CLIENT ACCEPTE 0.0.0.0 0 //affichage dans le main pour le 1er client
addr 0.0.0.0.62135 //affichage dans le thread pour le 1er client
NOUVEAU CLIENT ACCEPTE 127.0.0.1 56336 //affichage dans le main pour 2e
addr 0.0.0.0.62135 //affichage dans le thread pr le 2e
NOUVEAU CLIENT ACCEPTE 127.0.0.1 53956
addr 0.0.0.0.62135
je peux lancer autant de client que je veux le thread spécifique au client affichera toujours addr 0.0.0.0.62135
voici une partie de mon main :
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 while(1) { int desc ; int descbis ; if ((desc = accept(s,(struct sockaddr *)client,&lg))==-1) { perror("ERREUR ACCEPT") ; exit(-7) ; } else { char rep[50] ; getcwd(rep,49) ; Client c = creerClient(desc,client, rep) ; //ajoutClient(liste, c) ; printf("NOUVEAU CLIENT ACCEPTE %s %d \n",inet_ntoa(client->sin_addr), ntohs(client->sin_port) ) ; pthread_t fils ; if (pthread_create(&fils, NULL, threadClient, c)) { perror("pthread_create"); exit(EXIT_FAILURE); } free(client) ; } }
la structure pour le passage de parametre :
et l'affichage dans le thread :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 typedef struct client { int socketCommande ; int socketTransfert ; char * repertoireCourant ; struct sockaddr_in * ip ; struct client * suivant ; }Client;
si vous pouviez m'éclairer ça serait génial bonne journée à tous
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void * threadClient(struct client l) { DIR * rep ; int s2 ; printf(" %s.%d\n", inet_ntoa(l.ip->sin_addr), ntohs(l.ip->sin_port)) ;
Partager