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 :

Client serveur pour un palindrome


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Client serveur pour un palindrome
    Bonsoir,

    J'ai voulu le testé juste comme ça;car j'aime bien testé des codes.
    Mais le problème c'est qu' il y a une erreur;j'ai fait part de ceci à celui qui a posté ce code mais il n'a toujours pas répondu;donc je me tourne vers vous.
    Erreur lors de l'exécution: segmentation fault
    Débogue: erreur au niveau de la variable mot.
    L'erreur survint au niveau du code du client :ligne 16 sinon la ligne 19 quand la ligne 16 est en en commentaire et 22 quand la ligne 16 et 19 sont en commentaires.

    Voici le code
    serveur.c

    /*** Fichier Serveur ***/
    /* Il créée une fifo tube_serveur dans laquelle il recevra les messages des clients*/
    /* Chaque message est composé du nom de la fifo client et du mot qu'envoit le client : "fifo;mot"*/
    /* Le serveur détruit le tube serveur, crée le tube du client, analyse le mot puis renvoit sa réponse au client via son tube */

    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
    #include "librairie.h"
    #include "./palindrome.c"
     
    int main()
    {   char tube_serveur[TAILLE_CHAINE]="tube_serveur.fifo";
        int sortieTube; /* pointera sur la sortie du tube serveur */
        int entree_tube;/* pointera sur le tube client */
        char chaineALire[TAILLE_CHAINE];/*chaine à lire dans le tube serveur*/
        char chaineAEcrire[TAILLE_CHAINE]; /*chaine à écrire dans le tube du client*/
        char *tube_client;/*un pointeur pour la fonction strtok (chaineALire, ";") qui permet de segmenter chaineALire */
        char *mot;/* mot que le client veut tester si c'est un palindrome ou non */
     
        do /* while((strcmp(mot,"FIN") != 0) ); => tant que le client n'a pas dit FIN */
        {   /***************** création tube serveur **********************/
            if(mkfifo(tube_serveur, 0644) != 0)
            {   fprintf(stderr, "Impossible de créer le tube nommé.\n");
                exit(EXIT_FAILURE);
            }
            /**************** Attente d'un appel client ******************/
            if((sortieTube = open (tube_serveur, O_RDONLY)) == -1)
            {
                fprintf(stderr, "Impossible d'ouvrir la sortie du tube nommé.\n");
                exit(EXIT_FAILURE);
            }
            read(sortieTube, chaineALire, TAILLE_CHAINE);
            unlink(tube_serveur);
            printf("%s\n", chaineALire);
            tube_client = strtok (chaineALire, ";");/* segmente la chaine par le séparateur ; donc tube_client vaut le nom du tube du client (1ère partie de la chaine)*/
            mot = strtok (NULL, ";");
            printf ("client : %s\n", tube_client);
            printf ("message : %s\n", mot);
            /************* Ecriture dans le tube client ********/
            unlink(tube_client);/*on détruit le dernier tube client*/
            if(mkfifo(tube_client, 0644) != 0)
            {   fprintf(stderr, "Impossible de créer le tube nommé.\n");
                exit(EXIT_FAILURE);
            }
            if((entree_tube = open(tube_client, O_WRONLY)) == -1)
            {   fprintf(stderr, "Impossible d'ouvrir l'entrée du tube nommé.\n");
                exit(EXIT_FAILURE);
            }
     
            if (strcmp(mot,"FIN") == 0)/*Si le mot vaut FIN on le serveur inutile d'utiliser la fonction de palindrome */
            {   memset( chaineAEcrire, '\0', sizeof(chaineAEcrire) );
                sprintf(chaineAEcrire,"Fin du serveur");
            }
            else
            {
                if(isPalindrome(mot))/* Le mot est-il un palindrome? */
                {   memset(chaineAEcrire, '\0', sizeof(chaineAEcrire) );/*remplace toutes les cases de la chaine par \0 : vide la chaine*/
                    sprintf(chaineAEcrire,mot);/*on écrit le mot dans la chaine*/
                    strcat(chaineAEcrire, " est un palaindrome."); /* on indique que c'est un palindrome */
                }
                else
                {   memset( chaineAEcrire, '\0', sizeof(chaineAEcrire) );
                    sprintf(chaineAEcrire,mot);
                    strcat(chaineAEcrire, " n'est pas un palaindrome.");
                }
            }
            write(entree_tube,chaineAEcrire, TAILLE_CHAINE);/* réponse au client */
        }
        while((strcmp(mot,"FIN") != 0) );
        /************** Programme terminé *****************************/
        unlink(tube_serveur);
        printf("fin du serveur");
        return EXIT_SUCCESS;
    }
    clientB.c : l'utilisateur peut lui même écrire les mots!

    /*** Fichier ClientB ***/


    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
     
    #include "librairie.h"/* contient toute les librairies à inclure */
     
    int main()
    {   char tube_serveur[TAILLE_CHAINE]="tube_serveur.fifo"; /* tube pour envoyer des messages au serveur */
        char tube_client[TAILLE_CHAINE]="tube_client.fifo"; /* tube pour recevoir les message du serveur*/
        int entree_tube;/* pointera sur le tube du serveur */
        int sortieTube;/* pointera sur le tube du client */
        char chaineALire[TAILLE_CHAINE];
        char chaineAEcrire[TAILLE_CHAINE];/* chaine envoyée au serveur */
        char *mot="";/*obligation d'initialiser car pedantic indique une erreur sinon*/
     
        printf("Bienvenue sur mini-projet Palindrome Client/Serveur!\n");
        printf("Veuiller saisir un mot pour savoir si c'est un palindrome \n(pour quitter le programme saisissez : FIN)\n\n");
        do /* Pas de for car l'objectif d'optimisation est que le l'utilisateur tape les mot auquel cas on ne saurait pas combien il souhaite en tester(sauf s'il l'indique)*/
        {   memset(mot, '\0', sizeof(mot) );/*vide la variable mot*/
            memset(chaineAEcrire, '\0', sizeof(chaineAEcrire) );/*vide la variable mot*/
            printf("Saisir un mot : ");
            scanf("%s",mot); /*utilisateur entre le mot*/
            strcat(chaineAEcrire,tube_client); /*formation de la chaine "tube_client.fifo;mot" */
            strcat(chaineAEcrire,";");
            strcat(chaineAEcrire,mot);
            /************* Ecriture dans le tube serveur ********/
            while((entree_tube = open(tube_serveur, O_WRONLY)) == -1)
            {   sleep(1); /* on attend que le serveur soit disponnible avant d'écrire, permet aussi de pouvoir lancer le client avant le serveur sans plantage de celui-ci*/
                /*on peut imaginer un compteur qui abandonne au bout bout de cpt seconde : cpt=1;sleep(1); cpt++*/
            }
            write(entree_tube,chaineAEcrire, TAILLE_CHAINE);
     
            /****************  Lecture de la réponse du serveur ******************/
            while((sortieTube = open (tube_client, O_RDONLY)) == -1)
            {   sleep(1);/*idem que pour l'entrée, (plusieurs soucis ont été rencontré quand le client faisait lui meme sa fifo donc j'ai préférer donner la crétaion du tube client au serveur*/
            }
            read(sortieTube, chaineALire, TAILLE_CHAINE);
            printf("%s\n", chaineALire);
        }
        while((strcmp(mot,"FIN") != 0));
        /*************** FIN DU PROGRAMME ******************/
        unlink(tube_client);/* Bine que le serveur ne le fasse on n'est jamais trop prudent et ceci ne génère pas d'erreur de le supprimer alors qu'il n'existe plus*/
        return EXIT_SUCCESS;
    }


    /*** fichier librairie.h ***/
    /* permet d'éviter de retaper plusieurs fois les includes dans chaque fichier */
    /* centralise les librairie */

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>/*pour utiliser strtok par exemple*/
    #define TAILLE_CHAINE   256


    /*** fichier palindrome ***/
    /* contient la fonction de test du palindrome */
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
     
    int isPalindrome(char *t)
    {   int i;/*emplacement de la lettre en commencant par le début (ex : t[0] puis t[1]...*/
        int j;/*emplacement de la lettre en commencant par le début (ex : t[n] puis t[n-1]...*/
        int n=strlen(t); /* taille de la chaine  */
        for(i=0,j=n-1;i<j;i++,j--)
        {   if(tolower(t[i])!=tolower(t[j])) /*on met en minuscule car A!=a or Anna est un palindrome */
            {     return 0;/*ce n'est pas un palindrome*/
            }
        }
        return 1;
    }

  2. #2
    Membre régulier Avatar de ekieki
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 103
    Points
    103
    Par défaut
    Le problème vient de ta variable mot dans le code du client.

    déclare-la comme un tableau de caractères de longueur raisonnable
    char mot[100];

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Réponse
    ok je vais faire cela pour voir si ça fonctionne merci de m'avoir répondu

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Reponse definitive
    Bonsoir je te remercie;c'est OK;ça fonctionne.

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

Discussions similaires

  1. Architecture client serveur pour un jeu
    Par cb-bk dans le forum Réseau et multijoueurs
    Réponses: 13
    Dernier message: 29/07/2009, 01h00
  2. Client-serveur pour jeu en ligne
    Par boubou_cs dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 09/05/2009, 17h33
  3. [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
  4. [Indy] Client-serveur pour recevoir des flux videos
    Par Nicodemus dans le forum Web & réseau
    Réponses: 7
    Dernier message: 10/10/2005, 14h18
  5. Langage le mieux adapté pour application client serveur ?
    Par guenus dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 17/06/2002, 15h46

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