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

Threads & Processus C++ Discussion :

[Linux]Thread et sockets qui ne font pas bon ménage


Sujet :

Threads & Processus C++

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2009
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 277
    Points : 742
    Points
    742
    Par défaut [Linux]Thread et sockets qui ne font pas bon ménage
    Salux !

    Je fais un petit thread d'écoute, donc j'ai deux fonctions :

    void listener_start(int port) qui va initialiser tout le bouzin pour écouter le port adéquat

    void listener_loop(void* data) pour la boucle d'écoute.

    L'écoute se fait sur la socket insock, qui est initialisée dans listener_start. J'ai d'abord fait des tests sans les threads, càd listener_start qui appelle listener_loop : tout c'est passé nickel.

    Ensuite j'ai mis à la fin de listener_start :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_create( &listenerthread, NULL, listener_loop, NULL );
    et puis plus rien !
    La fonction accept plante lamentablement et crashe l'application, j'ai pas trop compris pourquoi

    Code de listener_loop :
    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
    void* listener_loop( void* data )
    {
      if( listen( insocket, 1 ) == -1 )
      {
        cout << "Unable to listen\n";
        return NULL;
      }
     
      cout << "Listening\n";
     
      while( state > 0 )
      {
        csocket = accept( insocket, (sockaddr*) &csin, (socklen_t*) &sinsize );
        if( csocket == -1 )
        {
          cout << "Error while establishing an incoming connection\n";
          continue;
        }
     
        // processing incoming message
        char buffer[1024];
        int n=0;
        if( ( n = recv( csocket, buffer, sizeof( buffer ) - 1, 0 ) ) < 0 )
        {
          cout << "Error while incoming message\n";
          continue;
        }
        buffer[n] = '\0';
        cout << "Incomming message : " << buffer << endl;
     
        process_message( buffer );
     
        close( csocket );
      }
    }

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut
    Salut,
    je n'ai pas tout a fait saisi ton problème.

    Cependant je te conseil de regarder du cote de la fonction select (man 2 select) qui permet dans beaucoup de cas d'éviter de threader l'application et ainsi d'eviter de nombreuses erreurs.

    Cordialement,
    NeoKript

Discussions similaires

  1. [DisplayTag] Tri et pagination ne font pas bon ménage
    Par tiboudchou dans le forum Taglibs
    Réponses: 4
    Dernier message: 31/03/2010, 12h22
  2. rich:calendar, DIV et IE ne font pas bon ménage
    Par chotana dans le forum JSF
    Réponses: 1
    Dernier message: 20/04/2009, 17h16
  3. C++ et VB6 ne font pas bon ménage!
    Par Tuizi dans le forum C++
    Réponses: 6
    Dernier message: 18/07/2008, 10h03
  4. Le wifi et Club Internet ne font pas bon ménage!
    Par Ylias dans le forum La taverne du Club : Humour et divers
    Réponses: 5
    Dernier message: 20/08/2007, 10h30
  5. Réponses: 2
    Dernier message: 12/08/2007, 15h27

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