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

C Discussion :

Passage de paramètre CreateThread


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Passage de paramètre CreateThread
    Bonjour,

    Je suis actuellement sur un projet perso de serveur de chat mode console avec mon protocole bien à moi...

    Donc, dès que je fais un accept, je lance un thread avec en paramètre une structure qui contient la socket du client, celle du serveur et la structure SOCKADDR_IN de l'accepté.

    Mais le soucis, c'est que les données que j'ai mis dans la structure une fois passées au thread, son différentes.
    J'ai franchement du mal à comprendre pourquoi.

    Le code de la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct paramserv
    {
        int server;
        int client;
        SOCKADDR_IN *info;     
     
    }paramserv;
    Voici un extrait du code dans la boucle serveur:
    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
     
    if (listen(s_server, 64) == SOCKET_ERROR) /* listen : commencer l'ecoute */
                        fprintf(stderr, "La fonction listen a echoue.\n");
                    else
                    {//on créé un processus pour le client en demande de connection
     
                        while(1) //acceptation de nouveaux clients.
                        {
     
                            s_client = accept(s_server, (SOCKADDR *)&client, &csize);//entité bloquante.
     
                            if (s_client == INVALID_SOCKET)
                                fprintf(stderr, "La fonction accept a echoue.\n");
                            else
                            {
                                printf("nouveau client accepte\n");
                                pr->client=s_client;
                                pr->server=s_server;
                                pr->info=&client;//client = structure 
                                CreateThread(NULL,(int)NULL,(LPTHREAD_START_ROUTINE) newClient, (LPVOID)&pr,(int) NULL, &dwThread);
     
                            }
                        }
     
                    }
    Et le code de la fonction appelée par le thread:
    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
     
    void newClient(paramserv *pr)
    {
     
        printf("client %d",pr->client);
        printf("serveur %d",pr->server);
        SOCKET s_client = pr->client;
        int s_server = pr->server;
        SOCKADDR_IN *client = pr->info;
        char pseudo[32];
     
        //int csize = sizeof(client);
        //s_client = accept(s_server, (SOCKADDR *)&client, &csize);
     
        if (s_client == INVALID_SOCKET)
            fprintf(stderr, "La fonction accept a echoue.\n");
        else
        {....

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    C'est dur à déterminer juste en voyant ton code, mais ça me rappelle un problème que j'ai eu : méfies toi de la durée de vie ce que tu transmets à CreateThread(). Le thread peut mettre un certain temps à se créer, pendant lequel l'appelant de createthread continue. Le cas présent, on dirait que ta structure "client" va sortir du scope (et donc disparaitre), ce qui est un problème parce que tu en transmets un pointeur, et donc le thread va adresser n'importe quoi.

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    salut

    je ne vois pas de souci de passage de paramètre !!

    Par contre, tu as un gros problème avec pr. Côté "main", tu as pr que tu passes à tous les threads créés. tu as 1 pr, donc 1 adresse de structure; tous tes threads pointeront la même adresse (celle de pr), donc toutes les valeurs sont les mêmes => tous les threads pointeront, à terme, sur les données IP du dernier client(SOCKADDR_IN *client = pr->info;).

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par mala92 Voir le message
    salut

    je ne vois pas de souci de passage de paramètre !!

    Par contre, tu as un gros problème avec pr. Côté "main", tu as pr que tu passes à tous les threads créés. tu as 1 pr, donc 1 adresse de structure; tous tes threads pointeront la même adresse (celle de pr), donc toutes les valeurs sont les mêmes => tous les threads pointeront, à terme, sur les données IP du dernier client(SOCKADDR_IN *client = pr->info;).
    En effet j'étais pas reveillé, j'étais sûr que la portée de client était incorrecte. Vilain moi, je m'étais dit de ne plus répondre sur des forums sans avoir pris du café avant. Ta réponse fait apparaitre le problème de façon évidente en effet.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par phi1981 Voir le message
    En effet j'étais pas reveillé, j'étais sûr que la portée de client était incorrecte. Vilain moi, je m'étais dit de ne plus répondre sur des forums sans avoir pris du café avant. Ta réponse fait apparaitre le problème de façon évidente en effet.
    Oui tout à fait.
    J'ai trouvé la solution par moi même. J'avais tenté plusieurs méthodes différentes avant. Du coup a chaque itération je redéclare une structure paramserv et c'est ok. Me reste plus qu'a finaliser le transfert de fichier et c'est bon. Merci de votre aide. Je garde le sujet ouvert au cas où, je posterais mon code si bien entendu ça vous intéresse.

Discussions similaires

  1. [Forms]Passage de paramètre entre Forms et Reports
    Par jack554 dans le forum Reports
    Réponses: 4
    Dernier message: 30/03/2004, 13h58
  2. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15
  3. [XSL] Passage de paramètres à un template
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2003, 13h28
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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