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

  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

  9. #9
    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
    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
     
    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'
    Rien de nouveau. Tu utilises une bibliothèque externe, il faut la lier à ton projet :

    -lpthread

    Rappel :
    Citation Envoyé par -ed-
    Introduction

    La norme POSIX.1 fournit un ensemble de primitives permettant de réaliser des processus légers. Contrairement aux processus habituels, la mémoire est commune. Ces processus légers sont communément appelés 'threads' ou 'tâches'. Selon l'implémentation, l'ensemble des primitives est, par exemple, regroupé dans la bibliothèque libpthread.a (gcc) qu'il faut bien sûr penser à ajouter au projet (-lpthread).
    Je t'engage à cesser de 'lire en diagonale' et à commencer à 'lire sérieusement'.

  10. #10
    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 cette fois j'avais cru que je l'avais mis c'est ca qui m'enervais.

    Pouvez vous analyser le code et me dire ce qui ne va pas car point de vue utilisation c'est la catastrophe. Je dois aller en cours, je verrai tout ca ce soir (les vacances )

    Merci d'avance

  11. #11
    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'avance un peu :

    Partie serveur :

    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
     
    /*
      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
    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;
    }
    myHeader.h (je ne trouve pas de meilleurs nom)

    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
     
    #ifndef MYHEADER_H
    #define MYHEADER_H
    #ifdef WIN32
       #define CLS() system("CLS")
    #elif defined (linux)
       #define CLS() system("clear")
    #else
       #error Not defined for this plateforme
    #endif
    #define SUCCESS 0
    #define FAILURE -1
    void fclean(char *s_buffer, FILE *stream);
    void pause(char const *s_message);
    #endif //MYHEADER_H
    myHeader.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
     
    #include <stdio.h>
    #include <string.h>
    #include <stddef.h>
    #include "myHeader.h"
    void fclean(char *s_buffer, FILE *stream)
    {
        if (s_buffer != NULL && stream != NULL)
        {
            char *pc = strchr(s_buffer, '\n');
     
            if (pc != NULL) /* La saisie n'a pas été tronquée */
            {
                 /* On remplace '\n' par le caractère nul '\0' */
                 *pc = 0;
            }
            else
            {
                /* La saisie a été tronquée, on purge le flux d'entrée */
                int c;
                while ((c = fgetc(stream)) != '\n' && c != EOF)
                {
                      //Rien
                }
            }
        }
    }
    void pause (const char *s_message)
    {
       if (s_message != NULL && strlen (s_message) != 0)
       {
          fprintf (stdout, "%s", s_message);
          fflush (stdin);          //If I write “stdout”, s_message is not visible !
       }
       {
          char c[2];
          fgets (c, sizeof c, stdin);
          fclean (c, stdin);
       }
    }
    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 *p_data);
    #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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "send.h"
    #include "myHeader.h"
    void *sendMessage(void *p_data)
    {
     SOCKET *p_sock = p_data;
      if(p_data != NULL)
     {
      SOCKET sock = *p_sock;
        int end = 1, sock_err = 0;
      char myMessage[256];
      do
      {
         fprintf(stdout, "com:>");
         fgets(myMessage, sizeof (myMessage), stdin);
       fclean(myMessage, stdin);
       fprintf(stdout, "\n");
       if(strcmp(myMessage, "STAT_EXIT")==0)
       {
           sock_err = send(sock, myMessage, strlen(myMessage), 0);
        end=0;
       }
       else if(strcmp(myMessage, "ACT_CLS")==0)
       {
        CLS();
       }
       else
       {
           sock_err = send(sock, 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);
        int rsltOfShutdown = shutdown(sock, 2);
      if(rsltOfShutdown != SUCCESS)
      {
       fprintf(stdout, "Erreur lors de la fin de connexion\n");
      }
      else
      {
         closesocket(sock);
       fprintf(stdout, "Fermeture de la connexion avec le client :%d\n", sock);
      }
     }
     return NULL;
    }
    Partie client

    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    /*
      Name: ClientMySocket
     Email: <a href="mailto:samyhocine@hotmail.fr">samyhocine@hotmail.fr</a>
     Website: <a href="http://www.samsoft.ift.fr" target="_blank">http://www.samsoft.ift.fr</a>
      Copyright: Gpl v2
      Author: Samy Hocine
      Date: 10/10/07 14:14
      Description: Partie client de MySock
    */
    #include <stdio.h>
    #include <stdlib.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 MYPORT 1025
    void fclean(char *s_buffer, FILE *stream);
    int main(void)
    {
      #if defined (WIN32)
            WSADATA WSAData;
         int error = WSAStartup(MAKEWORD(2,0), &WSAData);
     #else
        int error = 0;
      #endif
     fprintf(stdout, "Client 1.0\n\n");
     int end = 1;
      char serveurMessage[256];
     if(!error)
     {
      /* On construit la socket */
      SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);
     
      if(mySocket != INVALID_SOCKET)
      {
       SOCKADDR_IN sin;
       sin.sin_addr.s_addr = inet_addr("127.0.0.1");
       sin.sin_family = AF_INET;
       sin.sin_port = htons(MYPORT);
       /* Si la connection est re'ussie */
       if(connect(mySocket, (SOCKADDR *) &sin, sizeof(sin)) != SOCKET_ERROR)
       {
        fprintf(stdout, "Connexion re'ussie avec le serveur\n\n");
        do
        {
          fprintf(stdout, "Serveur: ");
                if(recv(mySocket, serveurMessage, sizeof(serveurMessage), 0) != SOCKET_ERROR)
          {
            if(strcmp(serveurMessage, "STAT_OFF")==0)
            {
             fprintf(stdout, "Je suis absent\n");
            }
            else if(strcmp(serveurMessage, "STAT_ON")==0)
            {
             fprintf(stdout, "Je suis revenu\n");
            }
            else if(strcmp(serveurMessage, "STAT_EXIT")==0)
            {
             fprintf(stdout, "Je suis parti\n");
             getchar();
             end=0;
            }
            else if(strcmp(serveurMessage, "ACT_IP")==0)
            {
             system("ipconfig>ip.txt");
             FILE* fileIp = fopen("ip.txt", "r");
             if(fileIp != NULL)
             {
               char ip[1024];
                fgets(ip, sizeof ip, fileIp);
               fclean(ip, stdin);
                          send(mySocket, ip, sizeof(ip), 0);
             }
             else
             {
               char errorOfIp[256] = "Erreur lors de la lecture de l'ip\n";
                          send(mySocket, errorOfIp, sizeof(errorOfIp), 0);
             }
            }
            else
            {
             fprintf(stdout, "%s\n", serveurMessage);
            }
          }
           }
         while(end!=0);
       }
       else
       {
        fprintf(stdout, "Echec de la connexion avec le serveur\n");
       }
         /* Fermeture de la socket */
       closesocket(mySocket);
      }
     }
      #if defined (WIN32)
            WSACleanup();
       #endif
       return EXIT_SUCCESS;
    }
    void fclean(char *s_buffer, FILE *stream)
    {
        if (s_buffer != NULL && stream != NULL)
        {
            char *pc = strchr(s_buffer, '\n');
            if (pc != NULL) /* La saisie n'a pas été tronquée */
            {
                 /* On remplace '\n' par le caractère nul '\0' */
                 *pc = 0;
            }
            else
            {
                /* La saisie a été tronquée, on purge le flux d'entrée */
                int c;
                while ((c = fgetc(stream)) != '\n' && c != EOF)
                {
                      //Rien
                }
            }
        }
    }
    Je vous explique comment fonctionne logiciel :

    La partie serveur est controlé par un "administrateur".
    Lors de la connexion avec un client, l'admin peut envoyer certaine "commande" pour avoir des infos sur le pc où est "installé" le client. Ce n'est pas un virus ni un trojan mais un logiciel que je vais utiliser sur mes pc (j'en ai 3 chez moi), une sorte de gestionnaire de réseaux (en gros). Le client traite la commande et envoi une réponse.

    Pour le moment on ne peut pas faire grand chose (ca viendra après), le plus important c'est que ca fonctionne (ce qui n'est pas le cas)

    protocole.txt

    C= client | S= Serveur
    __________________
    STAT_ON : Permet d'indiquer à l'autre que l'on est revenu.
    Soit S et C connecté :
    Si S envoie à C alors C recoit "S est présent"
    Si C envoie à S alors S recoit "C est présent"
    Soit S est connecté et C deconnecté
    Aucune action possible car au moment où C est parti, une deconnexion a été effectué entre S et C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IF C = deconnecte THEN
    send to S -> "C est parti"
    close connection
    Idem avec STAT_OFF
    __________________
    STAT_EXIT:
    Soit S et C connecté
    Si S envoie STAT_EXIT :
    code de S:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    fgets(commande, sizeof commande, stdin);
    if(strcmp(commande, "STAT_EXIT")==0)
    {
     send to C -> "S est parti"
     close connection
    }
    else
    {
     send to C->commande
    }
    Coté C: "S est parti" -> "deconnexion avec S"
    Il utilise pthread, le fichier : libpthreadGC2.a, libpthreadGC2.dll et les headers habituels.

    Le problème en ce moment c'est que lors de la connexion client serveur, le serveur ferme immédiatement la connexion et le client continu de recevoir des données Pourtant j'ai tout prévu (faut comprendre que non )

    Pouvez vous m'indiquer ce qui ne va pas ?

    Merci d'avance

  12. #12
    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
    J'avance un peu :

    Partie serveur :

    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       }
       while (1);
       getchar ();
       pthread_join (threadSend, NULL);
       pthread_join (threadReceive, NULL);
       return EXIT_SUCCESS;
    }
    Tu es bien conscient que ce qu'il y a après le while ne sera jamais exécuté ?

    J'ai renommé les myheaders.* en io.* (Input/Output), et le projet est dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _samsoft_/serv
    _samsoft_/cli
    _samsoft_/util
    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    .../serv/main.c
    .../serv/send.h
    .../serv/send.h
    .../cli/main.c
    .../util/io.c
    .../util/io.h
    et j'ai indiqué le chemin de base .../_samsoft_ au compilateur (-I...)

    ce qui permet de mettre dans le code :

  13. #13
    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
    En fait j'avais mis while(1) "en attendant" et j'ai oublié de remettre end!=0

    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
     
    /*
      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
    int main(void)
    {
      pthread_t threadSend;
      pthread_t threadReceive;
     int end = 1;
     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)
              {
                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);
          end = 0;
         }
         }
        }
      }
      else
      {
       fprintf(stderr, "Socket %d invalide", socketServ);
      }
     }
     #if defined (WIN32)
            WSACleanup();
      #endif
     }
     while(end!=0);
     getchar();
      pthread_join(threadSend, NULL);
      pthread_join(threadReceive, NULL);
      return EXIT_SUCCESS;
    }
    En revanche maintenant l'application client se referme de suite ce qui est étrange :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "send.h"
    #include "myHeader.h"
    void *sendMessage(void *p_data)
    {
     SOCKET *p_sock = p_data;
      if(p_data != NULL)
     {
      SOCKET sock = *p_sock;
        int end = 1, sock_err = 0;
      char myMessage[256];
      do
      {
         fprintf(stdout, "com:>");
         fgets(myMessage, sizeof (myMessage), stdin);
       fclean(myMessage, stdin);
       fprintf(stdout, "\n");
       if(strcmp(myMessage, "STAT_EXIT")==0)
       {
           sock_err = send(sock, myMessage, strlen(myMessage), 0);
        end=0;
       }
       else if(strcmp(myMessage, "ACT_CLS")==0)
       {
        CLS();
       }
       else
       {
           sock_err = send(sock, 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);
        int rsltOfShutdown = shutdown(sock, 2);
      if(rsltOfShutdown != SUCCESS)
      {
       fprintf(stdout, "Erreur lors de la fin de connexion\n");
      }
      else
      {
         closesocket(sock);
       fprintf(stdout, "Fermeture de la connexion avec le client :%d\n", sock);
      }
     }
     return NULL;
    }
    En effet, la connexion se coupe si et seulement si l'admin tape "STAT_EXIT"

    Lors de la récéption (partie client), voilà le code :

    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    /*
      Name: ClientMySocket
     Email: <a href="mailto:samyhocine@hotmail.fr">samyhocine@hotmail.fr</a>
     Website: <a href="http://www.samsoft.ift.fr" target="_blank">http://www.samsoft.ift.fr</a>
      Copyright: Gpl v2
      Author: Samy Hocine
      Date: 10/10/07 14:14
      Description: Partie client de MySock
    */
    #include <stdio.h>
    #include <stdlib.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 MYPORT 1025
    void fclean(char *s_buffer, FILE *stream);
    int main(void)
    {
      #if defined (WIN32)
            WSADATA WSAData;
         int error = WSAStartup(MAKEWORD(2,0), &WSAData);
     #else
        int error = 0;
      #endif
     fprintf(stdout, "Client 1.0\n\n");
     int end = 1;
      char serveurMessage[256];
     if(!error)
     {
      /* On construit la socket */
      SOCKET mySocket = socket(AF_INET, SOCK_STREAM, 0);
     
      if(mySocket != INVALID_SOCKET)
      {
       SOCKADDR_IN sin;
       sin.sin_addr.s_addr = inet_addr("127.0.0.1");
       sin.sin_family = AF_INET;
       sin.sin_port = htons(MYPORT);
       /* Si la connection est re'ussie */
       if(connect(mySocket, (SOCKADDR *) &sin, sizeof(sin)) != SOCKET_ERROR)
       {
        fprintf(stdout, "Connexion re'ussie avec le serveur\n\n");
        do
        {
          fprintf(stdout, "Serveur: ");
                if(recv(mySocket, serveurMessage, sizeof(serveurMessage), 0) != SOCKET_ERROR)
          {
            if(strcmp(serveurMessage, "STAT_OFF")==0)
            {
             fprintf(stdout, "Je suis absent\n");
            }
            else if(strcmp(serveurMessage, "STAT_ON")==0)
            {
             fprintf(stdout, "Je suis revenu\n");
            }
            else if(strcmp(serveurMessage, "STAT_EXIT")==0)
            {
             fprintf(stdout, "Je suis parti\n");
             getchar();
             end=0;
            }
            else if(strcmp(serveurMessage, "ACT_IP")==0)
            {
             system("ipconfig>ip.txt");
             FILE* fileIp = fopen("ip.txt", "r");
             if(fileIp != NULL)
             {
               char ip[1024];
                fgets(ip, sizeof ip, fileIp);
               fclean(ip, stdin);
                          send(mySocket, ip, sizeof(ip), 0);
             }
             else
             {
               char errorOfIp[256] = "Erreur lors de la lecture de l'ip\n";
                          send(mySocket, errorOfIp, sizeof(errorOfIp), 0);
             }
            }
            else
            {
             fprintf(stdout, "%s\n", serveurMessage);
            }
          }
           }
         while(end!=0);
       }
       else
       {
        fprintf(stdout, "Echec de la connexion avec le serveur\n");
       }
         /* Fermeture de la socket */
       closesocket(mySocket);
      }
     }
      #if defined (WIN32)
            WSACleanup();
       #endif
       return EXIT_SUCCESS;
    }
    void fclean(char *s_buffer, FILE *stream)
    {
        if (s_buffer != NULL && stream != NULL)
        {
            char *pc = strchr(s_buffer, '\n');
            if (pc != NULL) /* La saisie n'a pas été tronquée */
            {
                 /* On remplace '\n' par le caractère nul '\0' */
                 *pc = 0;
            }
            else
            {
                /* La saisie a été tronquée, on purge le flux d'entrée */
                int c;
                while ((c = fgetc(stream)) != '\n' && c != EOF)
                {
                      //Rien
                }
            }
        }
    }
    Merci d'avance

    PS: J'ai moi aussi renommé myHeader en io mais je laisse tout dans le même répertoire

  14. #14
    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
    En fait j'avais mis while(1) "en attendant" et j'ai oublié de remettre end!=0
    <...>
    Bien que j'ai ajouté l'initialisation des structures avant usage, j'avoue ne pas comprendre pourquoi le recv() du client n'est pas bloquant...

    La dernière version : http://delahaye.emmanuel.free.fr/_samsoft_

    Comme toujours, ce qui manque est là : http://delahaye.emmanuel.free.fr/clib

    Modifie port.h pour te remettre dans tes conditions. J'ai fait des tests avec un client TELNET. Il semblerait que la connexion ne soit pas maintenue. Comme si quelque chose sur le serveur la déconnectait juste après l'établissement... Je ne vois pas ce que ça pourrait être...

  15. #15
    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 super bien avancé Merci Emmanuel mais je n'ai pas encore utilisé vos fichiers (nouvelles versions), j'ai fait tout ca durant mon voyage : Paris-Allemagne ( 5 heures 1/2 )

    Tout est dans le zip :

    http://sayro.free.fr/SamSoft/projets/Reseaux/MySock.zip

    J'ai installé le système de thread dans la partie client

    Merci d'avance

    PS: Envoyer des messages et le recevoir ne fonctionne toujours pas
    PS2: Pourquoi dois-je modifier le port ? Quel port ?

  16. #16
    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
    PS2: Pourquoi dois-je modifier le port ? Quel port ?
    Déjà expliqué... Dans le code que j'ai posté, le port est 23 (telnet) dans port.h. Pour te remettre dans tes conditions de test (port 1025), il faut remplacer 0 par 1 dans le #if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef H_ED_PORT_20071026225804
    #define H_ED_PORT_20071026225804
     
    #if 0
    #define MY_PORT 1025
    #else
    #define MY_PORT 23
    #endif
     
    #endif /* guard */
     
    /* Guards added by GUARD (c) ED 2000-2005 Jan 17 2005 Ver. 1.7 */
    et recompiler les 2 projets.

  17. #17
    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 suivi votre conseil mais je ne comprend pas deux choses :

    Pourquoi :

    #if 0 (c'est toujours vrai ca non ?)

    Quelle différence y a t-il entre le port 23 et les autres ? (en gros).

    Sinon ca ne fonctionne toujours pas Et chez vous ?

  18. #18
    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
    J'ai suivi votre conseil mais je ne comprend pas deux choses :

    Pourquoi :

    #if 0 (c'est toujours vrai ca non ?)
    0 est toujours faux, donc la branche #if 0 n'est pas compilée, par contre la branche #else est compilée). Si on remplace 0 par <>0 (1, par exemple), la branche #if est compilée et la branche #else ne l'est pas. Tu ne connais pas les macros conditionnelles ? Tu n'as pas de livre de C ? Ces notions sont basiques.
    Quelle différence y a t-il entre le port 23 et les autres ? (en gros).
    Le port 23 est le port dédié aux serveurs Telnet. Pour les autres (< 1024), il faut consulter certains documents sur le net (RFC) qui recensent les usages des ports. En général, ça correspond à un service bien particulier. Par exemple, 80 pour http, 21 pour FTP (je crois...) etc.

    Il faut savoir que pour qu'un serveur accepte un port < 1024 sous unixoïde, il doit s'exécuter en mode superviseur (ou superutilisateur ou superuser ou su).

  19. #19
    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'utilise donc le port 23 à partir de maintenant. (N'y aura t'il pas de conflits avec d'autres app utilisant le port 23 ?)

    Merci pour le #if 0 (je ne savais pas et je n'ai pas de bouquins sur le C, chose qui changera bientôt ) La question qui me vient maintenant à l'esprit est pourquoi avoir mis une supposition qui sera tout le temps fausse, le mieux ce ne serait pas de mettre directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define MY_PORT 23
    Non ?

    Sinon avez vous une idée pour le problème ? (peut être au niveau des boucles ? non ?)

    Merci pour tout et d'avances

  20. #20
    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
    Je post résolu ici car je viens de me rendre compte que le titre est "Problème avec les thread" or ceci est résolu.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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