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

Linux Discussion :

Thread Posix - Linux


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut Thread Posix - Linux
    Bonjour, hier soir je me suis intéressé aux pthreads linux, j'ai teste ce code pour verifier si tout fonctionne correctement :

    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
    #include <iostream>
    #include <pthread.h>
     
    using namespace std;
     
     
    void* Thread(void *);
     
    int main()
    {
       pthread_t Thread_id;
       char *string = "Hello !\n";
     
       pthread_create(&Thread_id, 0, &Thread, (void *) string);
     
       return 0;
    }
     
    void* Thread(void *param)
    {
       char *message = (char *) param;
       cout << message << endl;
    }
    Aucune erreur n'est générée lors de la complation, mais un "Segmentation fault" est signale lors de son éxécution :s
    je ne comprends pas... ca doit surement venir de mon code mais je ne vois pas où...

    Merci :-)

  2. #2
    Membre averti Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Points : 412
    Points
    412
    Par défaut
    Salut...

    Tu doit linker ton application avec l'option -lpthread (sous linux) je sait... c'est bizard que ca se compile sans ca mais bon... c'est ta solution.
    J'aime pas les épinards... Mais alors pas du tout

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Ha genial !
    Merci !

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Je profite du même poste pour vous exposer mon problème. Je souhaite réaliser un serveur multi-client le plus simple possible, je l'ai fait, seul problème ; je n'arrive pas a recevoir des données avec recv() dans un 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
    19
    20
    21
    22
    23
    24
    #ifndef _NEED_H
    #define _NEED_H
     
    #define WELCOME "You're connected on trinity server...\n"
    #define LOGIN   "Choose a key for encrypt communication: "
     
    #define DEFAULT_PORT 444
    #define SOCK_ERROR -1
     
    #define MAX_CLIENT 10
    #define MAX_RECV 256
     
    typedef struct
    {
      sockaddr_in csin;
      char key[20];
      bool state;
      int sockd;
    } Client;
     
    Client Cl[MAX_CLIENT];
    pthread_t Thread_id[MAX_CLIENT];
     
    #endif
    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
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <pthread.h>
    #include <iostream>
    #include <stdio.h>
     
    #include "need.h"
     
    using namespace std;
     
     
    void* Thread_Client(void *);
    void* Thread_Encrpt(void *);
    void* Thread_Check(void *);
     
     
    int sockd;
     
    int main(int argc, char *argv[])
    {
       sockaddr_in sin;
       int count;
     
       if((sockd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERROR)
       {
          cerr << "Creation socket error !\n";
          return 0;
       }
     
       sin.sin_family = AF_INET;
       sin.sin_port = htons(DEFAULT_PORT);
       sin.sin_addr.s_addr = inet_addr("127.0.0.1");
     
       if((bind(sockd, (sockaddr *) &sin, sizeof(sin)) == SOCK_ERROR))
       {
          cerr << "Bind socket error !\n";perror("");
          return 0;
       }
     
       listen(sockd, MAX_CLIENT);
     
       for(count = 0 ; count < MAX_CLIENT ; count++)
       {
          int len = sizeof(Cl[count].csin);
     
          // system("clear");
          cout << "Number of clients: " << count << "\n";
     
          if((Cl[count].sockd = accept(sockd, (sockaddr *) &Cl[count].csin, (socklen_t *) &len)) == SOCK_ERROR)
          {
             cerr << "Accept() error !\n";
             return 0;
          }
     
          pthread_create(&Thread_id[count], 0, &Thread_Client, (void *) &count);
     
          send(Cl[count].sockd, WELCOME, strlen(WELCOME), 0);
          send(Cl[count].sockd, LOGIN, strlen(LOGIN), 0);
       }
     
       system("pause");
       return 0;
    }
     
    void* Thread_Client(void *vParam)
    {
       int *nb = (int *) vParam;
       char buffer[MAX_RECV];
       *nb--;
     
       Cl[*nb].state = true;
     
       recv(sockd, buffer, sizeof(buffer), 0);
       cout << buffer << endl;
    }
     
    void* Thread_Encrypt(void *vParam)
    {
    }
     
    void* Thread_Check(void *vParam)
    {
    }
    En effet, dans le thread Thread_Client(), je ne reçois rien dans la variable buffer, une petite idée ?
    Merci

    Ps : L'erreur de recv() est : "Transport endpoint is no connected"

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Points : 18
    Points
    18
    Par défaut
    Le bug doit venir du thread puisque ni un recv(), ni un send() ne fonctione dans ce-dernier... :-(
    Une petite idée ?

Discussions similaires

  1. utilisation des threads posix (sous linux)
    Par Dom_the_quaker dans le forum C++
    Réponses: 1
    Dernier message: 27/05/2008, 11h09
  2. thread posix
    Par _matt_44 dans le forum POSIX
    Réponses: 9
    Dernier message: 11/05/2006, 12h07
  3. Réponses: 11
    Dernier message: 14/02/2006, 00h26
  4. Problème de creation de thread sous linux
    Par xilebo dans le forum POSIX
    Réponses: 4
    Dernier message: 27/10/2004, 09h58
  5. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59

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