IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

Passage de paramètres dans un thread


Sujet :

POSIX C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Points : 60
    Points
    60
    Par défaut Passage de paramètres dans un thread
    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 :


    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;
    et l'affichage dans le thread :

    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)) ;
    si vous pouviez m'éclairer ça serait génial bonne journée à tous

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par innosang
    ...
    Tu n'as pas le droit de changer le prototype du thread qui est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void* thread (void*p_user);
    Il faut donc écrire le code comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void * threadClient(void *p_user)
    {	
       if (p_user != NULL)
       {	
           struct client p_client = p_user;
           /* etc. */
    Evidemment, lors de l'appel, il faut passer l'adresse d'une structure unique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       struct client *p_cli = malloc (sizeof *p_cli);
       if (p_cli != NULL)
       {
          *p_cli = creerClient(desc,client, rep) ;
           ...
           if (pthread_create (&fils, NULL, threadClient, p_cli))
    Attention, 'fils' doit aussi être unique...

    http://emmanuel-delahaye.developpez....ds.htm#donnees
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage de plusieurs paramètres dans un thread.
    Par deck_bsd dans le forum Windows
    Réponses: 17
    Dernier message: 09/10/2010, 09h38
  2. Passage de paramètre dans le thread.
    Par minou777 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 19/09/2009, 16h29
  3. Passage de paramètres dans champ hidden
    Par benassis dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/05/2005, 01h22
  4. Réponses: 9
    Dernier message: 13/05/2005, 03h13
  5. Passage de paramètres dans une requête imbriquée
    Par DrakkoFR dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2005, 12h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo