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

Réseau C Discussion :

Problème avec les thread


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut Problème avec les thread
    Bonjour, je suis en train de developper une application client/serveur et là j'ai un petit problème avec les thread : (lors de la partie serveur)

    send.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef SEND_H
    #define SEND_H
    #if defined (WIN32)
    #include <winsock2.h>
    #elif defined (LINUX)
    /* Rien pour le moment */
    #else
    #error not defined for this platform
    #endif
    void* sendMessage(void *socket);
    #endif //SEND_H
    send.c

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "send.h"
    #include "myHeader.h"
    void* sendMessage(void *socket)
    {
      int end = 1, sock_err = 0;
     char myMessage[256];
     SOCKET newSocket = &socket;
     do
     {
        fprintf(stdout, "com:>");
        fgets(myMessage, sizeof (myMessage), stdin);
      fclean(myMessage, stdin);
      fprintf(stdout, "\n");
      if(strcmp(myMessage, "STAT_EXIT")==0)
      {
          sock_err = send(newSocket, myMessage, sizeof(myMessage), 0);
       end=0;
      }
      else if(strcmp(myMessage, "ACT_CLS")==0)
      {
       #if defined(WIN32)
        system("CLS");
       #elif defined(LINUX)
        system("clear");
       #endif
      }
      else
      {
          sock_err = send(newSocket, myMessage, sizeof(myMessage), 0);
       if(sock_err != SOCKET_ERROR)
       {
        fprintf(stdout, "Message est envoye'\n\n");
       }
       else
       {
        fprintf(stdout, "Erreur lors de l'envoie du message\n");
       }
       }
     }
     while(end!=0);
     return 0;
    }
    main.c

    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    /*
      Name: MySock
     Email: samyhocine_at_hotmail.fr
     Website: samsoft.ift.fr
      Copyright: Gpl v2
      Author: Samy Hocine
      Date: 07/10/07 18:14
      Description: Partie serveur
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include "pthread.h"
    #include "myHeader.h"
    #ifdef __cplusplus
    #error Be sure you are using a C compiler
    #endif
    #if defined (WIN32)
    #include <winsock2.h>
    #elif defined (LINUX)
    /* Rien pour le moment */
    #else
    #error not defined for this platform
    #endif
    #define MY_PORT 1025
    #define SUCCESS 0
    #define FAILURE -1
    void fclean(char *s_buffer, FILE *stream);
    void* sendMessage(SOCKET *socket);
    int main(void)
    {
     pthread_t threadSend;
     pthread_t threadReceive;
     do
     {
     #if defined (WIN32)
            WSADATA WSAData;
         int error = WSAStartup(MAKEWORD(2,0), &WSAData);
     #else
        int error = 0;
      #endif
      fprintf(stdout, "Serveur 1.0\n\n");
     if(!error)
     {
      /*
      Prototype : int socket(int domain, int type, int protocol);
      SOCK_STREAM c'est uniquement pour TCP/IP. Pour UDP/IP c'est SOCK_DGRAM
      On construit une socket
      */
      SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);
      /* Si ma socket est valide */
      if(mySocket != INVALID_SOCKET)
      {
       SOCKADDR_IN sin;
       int sock_err;
       fprintf(stdout, "La socket %d est ouverte en mode TCP/IP\n", mySocket);
       /* Adresse ip automatique */
         sin.sin_addr.s_addr = htonl(INADDR_ANY);
         sin.sin_family = AF_INET;
         /* Ecoute d'un port */
         sin.sin_port = htons(MY_PORT);
       sock_err = bind(mySocket, (SOCKADDR *) &sin, sizeof sin);
       if(sock_err != SOCKET_ERROR)
       {
        /* On commence l'e'coute */
        sock_err = listen(mySocket, 5);
        fprintf(stdout, "Ecoute du port %d ...\n", MY_PORT);
        if(sock_err != SOCKET_ERROR)
        {
         /* On attend que quelqu'un se connecte */
         fprintf(stdout, "Attente de connexion sur le port %d ...\n", MY_PORT);
         SOCKADDR_IN newSin;
              int recsize = (int) sizeof newSin;
              SOCKET newSocket = accept(mySocket, (SOCKADDR *) &newSin, &recsize);
              if (newSocket != INVALID_SOCKET)
              {
          int rsltOfShutdown;
                fprintf (stdout, "connexion d'un client avec la socket %d de %s:%d\n\n", newSocket, inet_ntoa (newSin.sin_addr), htons (newSin.sin_port));
          pthread_create(&threadSend, NULL, sendMessage, (void*)&newSocket);
          rsltOfShutdown = shutdown(newSocket, 2);
          if(rsltOfShutdown != SUCCESS)
          {
           fprintf(stdout, "Erreur lors de la fin de connexion\n");
          }
          else
          {
                 fprintf (stdout, "Fermeture du client avec la socket %d\n", newSocket);
                 closesocket(newSocket);
           fprintf(stdout, "Fermeture du serveur");
          }
         }
         }
        }
      }
      else
      {
       fprintf(stderr, "Socket %d invalide", mySocket);
      }
     }
     #if defined (WIN32)
            WSACleanup();
      #endif
     }
     while(1);
     getchar();
      pthread_join(threadSend, NULL);
      pthread_join(threadReceive, NULL);
      return EXIT_SUCCESS;
    }
    code d'erreur:

    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
     
    Compilateur: Default GCC compiler
    Building Makefile: "C:\Users\SamSoft\Documents\Programmation\projets\C\Sockets\Makefile.win"
    Exécution de  make clean
    rm -f obj/main.o obj/send.o obj/myHeader.o  release/Serveur.exe
    gcc.exe -c main.c -o obj/main.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
    main.c: In function `main':
    main.c:95: warning: passing arg 3 of `pthread_create' from incompatible pointer type
    gcc.exe -c send.c -o obj/send.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
    send.c: In function `sendMessage':
    send.c:12: warning: initialization makes integer from pointer without a cast
    gcc.exe -c myHeader.c -o obj/myHeader.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
    gcc.exe obj/main.o obj/send.o obj/myHeader.o  -o "release\Serveur.exe" -L"C:/Program Files/Dev-Cpp/Lib" ../../../../../../../Dev-Cpp/lib/libws2_32.a  
    obj/main.o:main.c:(.text+0x233): undefined reference to `_imp__pthread_create'
    make.exe: *** [release/Serveur.exe] Error 1
    Exécution terminée
    Merci d'avance

    PS: J'ai regardé : http://man.developpez.com/man3/pthread_create.3thr.php et j'ai compris comment fonctionne le truc mais je dois avoir un problème avec mes pointeurs ->->

    Les lignes surlignées :

    send.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SOCKET newSocket = &socket;
    main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pthread_create(&threadSend, NULL, sendMessage, (void*)&newSocket);
    PS2: L'indentation chez moi est parfaite mais ici c'est la catastrophe, désolé

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SOCKET newSocket = &socket;
    C'est plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SOCKET newSocket = *socket;

  3. #3
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Merci mais il reste toujours cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pthread_create(&threadSend, NULL, sendMessage, (void*)&newSocket);
    Merci d'avance

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Bonjour, je suis en train de developper une application client/serveur et là j'ai un petit problème avec les thread : (lors de la partie serveur)
    Ton code commenté et corrigé pour être compilable. Pose des questions si ce n'est clair.

    http://delahaye.emmanuel.free.fr/forums/samsoft/serv/

    Je recommande une lecture attentive de : http://emmanuel-delahaye.developpez.com/reseaux.htm, notamment http://emmanuel-delahaye.developpez....eaux.htm#texte, ainsi que http://emmanuel-delahaye.developpez.com/pthreads.htm, et notamment http://emmanuel-delahaye.developpez....ds.htm#donnees.

  5. #5
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Merci Emmanuel malheuresement je n'ai pas beaucoup de temps (3 contrôles cette semaine et une tonne de devoirs). Je verrai tout cela ce week end. Sinon je suis parti sur votre site partie pthread mais j'ai encore lu en diagonale Bon je reprendrai tout ce week end, encore merci

  6. #6
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    J'ai regardé ce que vous avez fait et j'ai modifié mon code de manière à le rendre correct. En revanche, j'ai toujours ce problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pthread_create(&threadSend, NULL, sendMessage, (void *) &socketClient);
    Voilà mes fichiers :

    http://sayro.free.fr/Samy/Prog/reseaux/

    Merci d'avance

    code d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Compilateur: Default GCC compiler
    Building Makefile: "C:\Users\SamSoft\Documents\Programmation\projets\C\Sockets\Makefile.win"
    Exécution de  make clean
    rm -f obj/main.o obj/send.o obj/myHeader.o  release/Serveur.exe
    gcc.exe -c main.c -o obj/main.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
    main.c: In function `main':
    main.c:96: warning: passing arg 3 of `pthread_create' from incompatible pointer type
    gcc.exe -c send.c -o obj/send.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
    gcc.exe -c myHeader.c -o obj/myHeader.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
    gcc.exe obj/main.o obj/send.o obj/myHeader.o  -o "release\Serveur.exe" -L"C:/Program Files/Dev-Cpp/Lib" ../../../../../../../Dev-Cpp/lib/libws2_32.a  
    obj/main.o:main.c:(.text+0x233): undefined reference to `_imp__pthread_create'
    make.exe: *** [release/Serveur.exe] Error 1
    Exécution terminée

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /* main.c */
    <...>
    void *sendMessage(SOCKET *p_data);
    Je pense te l'avoir déjà dit, mais ce prototype est
    • mal placé
    • faux

    Il devrait être dans "send.h" et être très exactement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *sendMessage(void *p_data);
    D'ailleurs, c'est cas. Il suffit donc de retirer le prototype faux de main.c et d'inclure send.h...

    Je suis à peu près certain d'avoir déjà expliqué tout ça, mais comme tu ne lis pas les réponses, je perds mon temps une fois de plus...

    Sauf cas exceptionnels concernant des fonctions privées (static), tu n'as pas à mettre de prototype séparé dans un source C. Idem avec fclean(). Ce qu'il y a dans "myheader.h" (vilain nom...) est suffisant.

  8. #8
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    /*
      Name: MySock
     Email: samyhocine_at_hotmail.fr
     Website: samsoft.ift.fr
      Copyright: Gpl v2
      Author: Samy Hocine et Emmanuel Delahaye
      Date: 07/10/07 18:14
      Description: Partie serveur
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include "pthread.h"
    /* dans le dossier de mon projet */
    #include "myHeader.h"
    #include "send.h"
    #ifdef __cplusplus
    #error Be sure you are using a C compiler
    #endif
    #if defined (WIN32)
    #include <winsock2.h>
    #elif defined (LINUX)
    /* Rien pour le moment */
    #else
    #error not defined for this platform
    #endif
    #define MY_PORT 1025
    #define SUCCESS 0
    #define FAILURE -1
    int main(void)
    {
     pthread_t threadSend;
     pthread_t threadReceive;
     do
     {
     #if defined (WIN32)
            WSADATA WSAData;
         int error = WSAStartup(MAKEWORD(2,0), &WSAData);
     #else
        int error = 0;
      #endif
      fprintf(stdout, "Serveur 1.0\n\n");
     if(!error)
     {
      /*
      Prototype : int socket(int domain, int type, int protocol);
      SOCK_STREAM c'est uniquement pour TCP/IP. Pour UDP/IP c'est SOCK_DGRAM
      On construit une socket
      */
      SOCKET socketServ = socket(AF_INET, SOCK_STREAM, 0);
      /* Si ma socket est valide */
      if(socketServ != INVALID_SOCKET)
      {
       SOCKADDR_IN sin;
       int sock_err;
       fprintf(stdout, "La socket %d est ouverte en mode TCP/IP\n", socketServ);
       /* Adresse ip automatique */
         sin.sin_addr.s_addr = htonl(INADDR_ANY);
         sin.sin_family = AF_INET;
         /* Ecoute d'un port */
         sin.sin_port = htons(MY_PORT);
       sock_err = bind(socketServ, (SOCKADDR *) &sin, sizeof sin);
       if(sock_err != SOCKET_ERROR)
       {
        /* On commence l'e'coute */
        sock_err = listen(socketServ, 5);
        fprintf(stdout, "Ecoute du port %d ...\n", MY_PORT);
        if(sock_err != SOCKET_ERROR)
        {
         /* On attend que quelqu'un se connecte */
         fprintf(stdout, "Attente de connexion sur le port %d ...\n", MY_PORT);
         SOCKADDR_IN newSin;
              int recsize = (int) sizeof newSin;
              SOCKET socketClient = accept(socketServ, (SOCKADDR *) &newSin, &recsize);
              if (socketClient != INVALID_SOCKET)
              {
          int rsltOfShutdown;
                fprintf (stdout, "connexion d'un client avec la socket %d de %s:%d\n\n", socketClient, inet_ntoa (newSin.sin_addr), htons (newSin.sin_port));
          pthread_create(&threadSend, NULL, sendMessage, (void *) &socketClient);
             rsltOfShutdown = shutdown(socketClient, 2);
          if(rsltOfShutdown != SUCCESS)
          {
           fprintf(stdout, "Erreur lors de la fin de connexion\n");
          }
          else
          {
                 closesocket(socketClient);
           fprintf(stdout, "Fermeture de la connexion avec le client :%d\n", socketClient);
          }
         }
         }
        }
      }
      else
      {
       fprintf(stderr, "Socket %d invalide", socketServ);
      }
     }
     #if defined (WIN32)
            WSACleanup();
      #endif
     }
     while(1);
     getchar();
      pthread_join(threadSend, NULL);
      pthread_join(threadReceive, NULL);
      return EXIT_SUCCESS;
    }
    Merci (je viens de m'en souvenir -_- Je lis en diagonale -_- )

    Il me reste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Compilateur: Default GCC compiler
    Building Makefile: "C:\Users\SamSoft\Documents\Programmation\projets\C\Sockets\Makefile.win"
    Exécution de  make clean
    rm -f obj/main.o obj/send.o obj/myHeader.o  release/Serveur.exe
    gcc.exe -c main.c -o obj/main.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
    gcc.exe -c send.c -o obj/send.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
    gcc.exe -c myHeader.c -o obj/myHeader.o -I"include"  -I"C:/Dev-Cpp/include"    -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -O3
    gcc.exe obj/main.o obj/send.o obj/myHeader.o  -o "release\Serveur.exe" -L"C:/Program Files/Dev-Cpp/Lib" ../../../../../../../Dev-Cpp/lib/libws2_32.a  
    obj/main.o:main.c:(.text+0x233): undefined reference to `_imp__pthread_create'
    make.exe: *** [release/Serveur.exe] Error 1
    Exécution terminée

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

Discussions similaires

  1. Un petit problème avec les Threads
    Par Zikas-r dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 11/12/2008, 19h42
  2. problèmes avec les threads
    Par lukbutor dans le forum C
    Réponses: 7
    Dernier message: 03/05/2007, 00h15
  3. Problèmes avec les thread et les pointeurs
    Par raspac dans le forum POSIX
    Réponses: 2
    Dernier message: 22/10/2006, 17h35
  4. [BOOST] Problème avec les threads
    Par SOAD08 dans le forum Dev-C++
    Réponses: 7
    Dernier message: 08/10/2006, 10h23
  5. Réponses: 5
    Dernier message: 10/05/2005, 10h22

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