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 :

Logiciel client serveur


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 Logiciel client serveur
    Bonjour, après 2heures de lecture, relecture et modifications de codes j'ai enfin compris d'où venait mon problème. Avant tout voilà comment se présente mon 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)

    Les sources : http://sayro.free.fr/SamSoft/projets/Reseaux/mySock.zip

    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 actuel est que mon logiciel, que ce soit client ou serveur ferme la connexion après l'établiton de cette dernière en un temps record , il m'est donc impossible d'envoyer ou recevoir quoi que ce soit. En utilisant une boucle dans main (partie client et serveur), le problème est le même. En gros pour le moment :

    point de vue serveur, on que le client se connecte puis ferme la connexion et relance l'attente.

    point de vue client, on se connecte, on ferme, et on attant de se reconnecter.

    C'est dans le main qu'il faut voir (des deux parties) mais j'arrive pas à visualiser la solution or il suffirait d'une boucle bien structurée mais je ne vois pas.

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Montres les parties de ton code où:
    1. Ton serveur accepte un client se connectant
    2. Ton client se connecte au serveur

  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
    Les sources ont été misent à jour : http://sayro.free.fr/SamSoft/projets/Reseaux/mySock.zip

    J'ai enfin reglé mon problème

    Tout fonctionne ou presque, il reste un dernier petit truc :

    Voilà le fichier send.c (qui est appelé enfin la fonction via un thread)

    Partie serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "send.h"
    #include "io.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)
    {
     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:>");
          fflush(stdout);
         fgets(myMessage, sizeof(myMessage), stdin);
       fclean(myMessage, stdin);
       if(strcmp(myMessage, "")!=0)
       {
        if(strcmp(myMessage, "STAT_EXIT")!=0)
        {
            sock_err = send(sock, myMessage, sizeof(myMessage), 0);
             if(sock_err != SOCKET_ERROR)
         {
               fprintf(stdout, "%d octet(s) envoye'(s)\n", sock_err);
               fflush(stdout);
         }
         else
         {
          fprintf(stdout, "Erreur lors de l'envoie du message : ");
          fprintf(stdout, "sock_err = %d", sock_err);
               fflush(stdout);
         }
         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");
               fprintf(stdout, "%d octet(s) envoye'(s)\n", sock_err);
               fflush(stdout);
         }
         else
         {
          fprintf(stdout, "Erreur lors de l'envoie du message\n");
               fflush(stdout);
         }
         }
       }
       else
       {
        fprintf(stdout, "Aucun texte tape'\n");
        fflush(stdout);
       }
      }
      while(end!=0);
     }
     else
     {
      fprintf(stdout, "Erreur : p_data = NULL\n");
      fflush(stdout);
     }
     return NULL;
    }
    Voilà le fichier main.c du client

    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
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    /*
      Name: ClientMySocket
     Email: samyhocine_at_hotmail.fr
     Website: samsoft.ift.fr
      Copyright: Gpl v2
      Author: Samy Hocine
      Date: 10/10/07 14:14
      Description: Partie client de MySock
     Infos: Quand le code sera ok, ajouter de la couleur
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include "io.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
    #if 0
    #define MY_PORT 1025
    #else
    #define MY_PORT 23
    #endif
    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, "\nClient 1.0\n\n");
     if(!error)
     {
      /* On construit la socket */
      SOCKET socketServeur = socket(AF_INET, SOCK_STREAM, 0);
     
      if(socketServeur != 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(MY_PORT);
       /* Si la connection est re'ussie */
       if(connect(socketServeur, (SOCKADDR *)&sin, sizeof(sin)) != SOCKET_ERROR)
       {
        int sock_err = 0, end = 0;
        char serveurMessage[256], myMessage[256] = "Message bien recu";
        fprintf(stdout, "Connexion re'ussie avec le serveur sur la socket %d\n\n", socketServeur);
            do
        {
          sock_err = recv(socketServeur, serveurMessage, (int) sizeof serveurMessage - 1, 0);
                if(sock_err != SOCKET_ERROR)
          {
            fprintf(stdout, "\n\nDonne'e recue avec succes\n\n");
            fflush(stdout);
            if(strcmp(serveurMessage, "STAT_OFF")==0)
            {
             fprintf(stdout, "Serveur %d : Je suis absent\n", socketServeur);
                      fflush(stdout);
            }
            else if(strcmp(serveurMessage, "STAT_ON")==0)
            {
             fprintf(stdout, "Serveur %d : Je suis revenu\n", socketServeur);
                      fflush(stdout);
            }
            else if(strcmp(serveurMessage, "STAT_EXIT")==0)
            {
             fprintf(stdout, "Serveur %d : Je suis parti\n", socketServeur);
                      fflush(stdout);
             getchar();
             end=0;
            }
            else if(strcmp(serveurMessage, "ACT_IP")==0)
            {
             /* rien pour le moment */
            }
            else
            {
             fprintf(stdout, "Serveur %d : %s\n", socketServeur, serveurMessage);
                      fflush(stdout);
            }
          }
          else
          {
           fprintf(stdout, "Erreur lors de la re'ce'ption : ");
           fprintf(stdout, "sock_err = %d\n\n", sock_err);
           fflush(stdout);
           end=0;
          }
          }
        while(end!=0);
            int rsltOfShutdown = shutdown(socketServeur, 2);
        if(rsltOfShutdown != SUCCESS)
        {
         fprintf(stdout, "Erreur lors de la fin de connexion\n");
        }
        else
        {
           #if defined (WIN32)
             closesocket(socketServeur);
         #elif defined (LINUX)
           close(socketServeur);
         #endif
         fprintf(stdout, "Fermeture de la connexion avec le client :%d\n", socketServeur);
        }
       }
       else
       {
        fprintf(stdout, "Echec lors de la connexion avec le serveur\n\n");
        system("PAUSE");
       }
      }
      else
      {
       fprintf(stdout, "\nSocket serveur %d est invalide\n", socketServeur);
       fflush(stdout);
      }
     }
     else
     {
      fprintf(stdout, "\nErreur avec WSADATA\n");
      fflush(stdout);
     }
     #if defined (WIN32)
       WSACleanup();
      #endif
     fprintf(stdout, "Fin du programme");
     fflush(stdout);
     getchar();
      return EXIT_SUCCESS;
    }
    Le logiciel a été revu : La partie serveur utilise deux thread, un pour send et un autre pour receive, et le client ne possède que le main, qui est une grosse boucle receive (qui traite les commandes envoyés par le client).

    Si vous pensez que le code est incorrect, compilez la partie client et la partie serveur et faites les test

    Le problème actuellement c'est que dès que le client recoit un message, il ferme la connexion. Dès que le serveur envoi un message, il y a une "erreur lors de la fin de connexion" et il ferme.

    Merci d'avance

  4. #4
    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
    Voilà, j'ai enfin (après 2jours de codage) résolu mon problème à 100%

    Merci à Emmanuel pour sa "note sur les réseaux" !

    Les sources sont disponiblent ici :

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

  5. #5
    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
    Voilà, j'ai enfin (après 2jours de codage) résolu mon problème à 100%

    Merci à Emmanuel pour sa "note sur les réseaux" !

    Les sources sont disponiblent ici :

    http://sayro.free.fr/SamSoft/projets/Reseaux/mySock.zip
    Le serveur a l'air stable. Attention, le code est mal organisé. Il ne faut pas recopier les headers comme ça. Il faut apprendre au compilateur où aller les chercher. C'est le role de l'option -I ou, sous Code::Blocks :

    Settings > Compiler > Directories

    pour indiquer au compilateur les répertoires où se trouvent les headers...

    Attention, j'avais séparé le code commun dans un 3ème répertoire (/util)...

    projet/client
    projet/server
    projet/util

    Il suffit d'ajouter le chemin de 'projet' et on accède avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "projet/util.h"

  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
    Je verrai cela demain ainsi que l'ajout de commandes car aujourd'hui c'était installation de linux kubuntu (je l'adore Adieu WIndows [je le garde quand meme sur le disque dur au cas où )

    Bonne journée

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

Discussions similaires

  1. Aide creation logiciel client/serveur FTP
    Par nenos11 dans le forum Windows
    Réponses: 1
    Dernier message: 25/04/2013, 11h03
  2. Logiciel Windows pour surveiller les postes client/serveur (type cybercafé)
    Par whitespirit dans le forum Autres Solutions d'entreprise
    Réponses: 0
    Dernier message: 11/10/2010, 12h21
  3. [Install] Installation des Logiciel Clients BO sur un serveur
    Par lampchris dans le forum Administration-Migration
    Réponses: 2
    Dernier message: 22/07/2009, 11h00
  4. [TFE] Logiciel client / serveur pour controler acces web
    Par bullrot dans le forum Gestion de projet
    Réponses: 0
    Dernier message: 07/03/2009, 09h30
  5. Réponses: 17
    Dernier message: 23/07/2007, 14h06

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