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 :

serveur d'application : serveur d'autorisations


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut serveur d'application : serveur d'autorisations
    salut,

    dans le cadre d'un homework, je dois développer un serveur d'autorisation de voyages relatif aux trains avec une seule voix ferrés, pour cela j'utilise une socket, 3 sémaphores systemV, mémoire partagée et evidement le fork pour garantir la continuité de service offert par le serveur, le code est quasiment prêt pour le serveur il reste uniquement la partie intractions avec les clients, mais j'ai eu 8 erreurs de compilations relatifs aux sémaphores et à l'appel d'une structure de données qui constitue la section critique: mon code s'étale sur deuc fichiers: train.h et train.c

    code du fichier train.h

    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
     #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/sem.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
     
     
    void StartServerTCP (int PortNum,int sockfd,int newsockfd,int clilen, struct sockaddr_in* serv_addr, struct sockaddr_in* cli_addr)
    {
    char buffer[256];
    //struct sockaddr_in serv_addr, cli_addr; // declarer une @ de type IPv4
    int n;
     
    if (PortNum ==0)
    {
    fprintf(stderr,"Erreur, Spécifiez le port");
    exit(1);
    }
     
    sockfd = socket(AF_INET, SOCK_STREAM,0); // création de socket
     
    if(sockfd<0)
    error("erreur d'ouverture de socket");
     
    bzero((char*)&serv_addr, sizeof(serv_addr));//remplir la structure par 0 : padding
    serv_addr->sin_family = AF_INET; // association d'une @ de type IPv4
    serv_addr->sin_addr.s_addr = INADDR_ANY;
    serv_addr->sin_port = htons(PortNum); // association de port en format Rx
     
    // association d'une @ et un port qcq à la socket crée  
    if(bind(sockfd,(struct sockaddr*)&serv_addr, sizeof(serv_addr))<0)  
     
    error("erreur d'association au port");
    // mark the socket so it will listen for incoming connexions
    listen(sockfd, 5); // écoute sur le port spécifié avec un max de 5 Connx possible en attente
    clilen= sizeof(cli_addr); // conversion de Type d'@ de client
    }
     
    int CreerSem(key_t cle, int NombreSem) // creation d'un sémaphore sysV
    {
    int semid;
    semid=semget(cle,NombreSem,IPC_CREAT|IPC_EXCL|600);
    if(semid==-1)
    {perror("SEMget");}
     
    return semid;
    }
     
    void InitialiserSem(int semid,int NumSem,int Val)
    {
    if(semctl(semid,NumSem,SETVAL,Val)==-1)
    {
    perror("Initialiser");exit(EXIT_FAILURE);
    }
    }
     
    void DetruireSem(int semid)
    {
    if(semctl(semid,0,IPC_RMID,0)==-1)
    {
    perror("Destroy"); exit(EXIT_FAILURE);
    }
    }
     
    void Down(int semid,int NumSem)
    {
    struct sembuf sb;
    sb.sem_num=NumSem;  // id de sémaphore
    sb.sem_op=-1;     // opération
    sb.sem_flg=SEM_UNDO ;  //Bloquant ou non sinon IPC_WAIT
    semop(semid,&sb,1);
    }
     
    void Up(int semid,int NumSem)  //int pour tester la valeur de retour
    {
    struct sembuf sb;
    sb.sem_num=NumSem;
    sb.sem_op=1;
    sb.sem_flg=SEM_UNDO ;
    semop(semid,&sb,1);
    }
     
    void Train_Tunis_Sousse_avant_voyage(Compteur * Compteur ,int mutexAB,int autorisation,int semid)
    {
    Down(semid,&mutexAB);
    if(Compteur->nbtrain_AB==0)
    {
    Compteur->nbtrain_AB++;
    Up(semid,&mutexAB);
    Down(semid,&autorisation);
    }
    else
    {
    Compteur->nbtrain_AB++;
    Up(semid,&mutexAB);
    }
    }
     
    void Train_Tunis_Sousse_apres_voyage(Compteur* Compteur,int mutexAB,int autorisation,int semid)
    {
    Down(semid,&mutexAB);
    Compteur->nbtrainAB--;
    if(Compteur->nbtrain_AB==0)
    {
    Up(semid,&mutexAB);
    Up(semid,&mutexAB);
    }
    else
    {
    Up(semid,&mutexAB);
    }
    }
     
    void Train_Sousse_Tunis_avant_voyage(Compteur* Compteur,int mutexBA,int autorisation,int semid)
    {
    Down(semid,&mutexBA);
           if(Compteur->nbtrain_BA==0)
           {
           Compteur->nbtrain_BA++;
           Up(semid,&mutexBA);
           Down(semid,autorisation);
           }
           else
           {
           Compteur->nbtrain_AB++;
           Up(semid,&mutexBA);
           }
    }
     
    void Train_Sousse_Tunis_apres_voyage(Compteur* Compteur,int mutexBA,int autorisation,int semid)
    {
    Down(semid,&mutexAB);
    Compteur->nbtrainAB--;
           if(Compteur->nbtrain_AB==0)
           {
           Up(semid,&mutexAB);
           Up(semid,&mutexAB);
           }
           else
           {
           Up(semid,&mutexAB);
           }
    }
    code du fichier train.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
     
     #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <stdlib.h>
    #include "train.h"
    #include <string.h>
    #define mutexAB 1
    #define mutexBA 2
    #define autorisation 3
     
    // Section critique : Ressource partagée
    typedef struct{int nbtrain_AB; int nbtrain_BA ;} Compteur;
     
    int main(int argc, char *argv[])
    {
     
    struct sockaddr_in serv_addr,client_addr;
    int sockfd,newsockfd,clilen;
    char buffer[256];
     
    if(argc<2)
    {perror("Erreur de port");exit(EXIT_FAILURE);}
    int shmid;
    // creation d'une zone memoire
    //-------------------------------------------------------------------------
    //*************************************************************************
    shmid=shmget(IPC_PRIVATE,sizeof(Compteur),IPC_CREAT|IPC_EXCL|0666); //  création mem partagée entre père et fils
           if(shmid==-1)
           {
           perror("shmget"),exit(EXIT_FAILURE);
           }
    Compteur *var=(Compteur*)malloc(sizeof(Compteur));  // déclaration d'une variable de type Compteur
    var=(Compteur*)shmat(shmid,NULL,0); // attachement du père à la zone mémoire
    if(var==NULL)
    {
    perror("shmat"),exit(EXIT_FAILURE);
    }
    var->nbtrain_AB=0; // initialisation à 0
    var->nbtrain_BA=0; // initialisation à 0
    //---------------------------------------------------------------------------
    //Création de sémaphore
    //***********************************************************************
    int semid=CreerSem(IPC_PRIVATE,3); // creation de 3 sémaphores systemV
    InitialiserSem(semid,mutexAB,1);  // initialisation à 1
    InitialiserSem(semid,mutexBA,1);  // initialisation à 1
    InitialiserSem(semid,autorisation,1);  // initialisation à 1
    int nb=atoi(argv[1]); // casting de type int
    // ouverture socket
    StartServerTCP(nb,sockfd,newsockfd,clilen,&serv_addr,&client_addr);
    while(1)
    {
    // traitement de père
    // accepter le client avec son @ et son port : socket client
    newsockfd = accept(sockfd, (struct sockaddr*)&client_addr, &clilen);
    if (newsockfd<0) // erreur dans le socket du client
    error("erreur d'acceptation");
    if(!fork())
    { // traitement de fils
    var=(Compteur*)shmat(shmid,NULL,0); // attachement de fils à la memoire
    if(var==NULL){perror("shmat"),exit(EXIT_FAILURE);}
    //****************************************************************
    // traitement de la demande de client
    //****************************************************************
    bzero(buffer,256);
    int n = read(newsockfd, buffer, 255); // lecture depuis le socket
    if (n<0)error("erreur de lecture du socket");
    char message[]="Train_Tunis_Sousse";
    if(strcmp(message,buffer)==0)
    {
            // prendre l'autorisation pour voyager de Tunis vers Sousse          
                Train_Tunis_Sousse_avant_voyage(&Compteur,mutexAB,autorisation,semid);
         // apurement de nombre de train après le voyage
             Train_Tunis_Sousse_apres_voyage(&Compteur,mutexAB,autorisation,semid); }
    else
    {
         // prendre l'autorisation pour le voyage de Sousse vers Tunis
     Train_Sousse_Tunis_avant_voyage(&Compteur,mutexBA,autorisation,semid);
         // apurement de nombre de train après le voyage
     Train_Sousse_Tunis_apres_voyage(&Compteur,mutexBA,autorisation,semid);
    }
    //détachement de la mémoire après la fin du traitement du fils clone
    if(shmdt(var)==-1){perror("Erreur détachement");exit(EXIT_FAILURE);}
    if(shmct(shmid,IPC_RMID,NULL)==-1)
    {perror("destruction");exit(EXIT_FAILURE);}
    // dégage lil fils ba3ed el voyage :p :p :p
    exit(EXIT_SUCCESS);
    }
    }
    return 0;
    }

    le message d'erreur est illustré par ce screen-shot





    j'ai pas compris l'erreur dans le fichier train.h !!! il s'agit d'une erreur à chaque fois que les 4 fonctions de traitement de l'autorisations sont appelés
    De plus l'erreur dans le fichier train.c qui indique une erreur lors de passage par adresse de la structure compteur qui constitue une section critique !!! je soupsonne le passage par @ de la structure

    Vos avis S'il vous plaît c'est très urgent !!!

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par hannibal007 Voir le message
    Vos avis S'il vous plaît c'est très urgent !!!
    Bon que c'est urgent ou pas , en est pas a la disponibilité en temps et en heure , ça reste un travail bénévole d'aider les autres ,surtout quand ils ne savent pas lire.

    En fait je trouve ça étrange c'est urgent mais tu prend même pas la peine de regarder ton code ?
    Voila je que j'ai fait j'ai regardé erreur ligne 87 et je vois ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Train_Tunis_Sousse_avant_voyage(Compteur * Compteur ,int mutexAB,int autorisation,int semid)
    Je suis obligé expliquer pourquoi ça plante ? ...
    Enfin ton code c'est un peu n'importe quoi Compteur est défini dans "train.c" donc après...
    J'ai pas vu la defintion de sembuf , elle semble y être nul part.

    Sinon on fout pas de code dans les headers (.h) , comme on ne met pas des includes n'importe ou (et surtout pas au milieu du code).

    Bref j'ai impression que t'as coder au pif , c'est vrai que l'ordre des déclarations c'est d'aucune importance.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Bon que c'est urgent ou pas , en est pas a la disponibilité en temps et en heure , ça reste un travail bénévole d'aider les autres ,surtout quand ils ne savent pas lire.
    Beinnn j'écris en français pas en chinois !!!!! en faite, je sais que c'est un travail bénévole sinon t'aurais pas faire une inscription au forum !!!
    En fait je trouve ça étrange c'est urgent mais tu prend même pas la peine de regarder ton code ?
    Voila je que j'ai fait j'ai regardé erreur ligne 87 et je vois ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Train_Tunis_Sousse_avant_voyage(Compteur * Compteur ,int mutexAB,int autorisation,int semid)
    Je suis obligé expliquer pourquoi ça plante ? ...
    Enfin ton code c'est un peu n'importe quoi Compteur est défini dans "train.c" donc après...
    ehhh ui!!! biensure que la structure Compteur est définie dans train.c comme variable globale vue par toute les fonctions et elle forme la section critique de mon programme dont on a besoin d'un Mutex pour assurer l'exclusion mutuelle et 2 sémaphores SystemV pour la syncronisation afin d'éviter des résultats imprévisibles et que Compteur *Compteur : un pointeur nommé Compteur qui pointe sur une structure de type Compteur !!!


    Bref j'ai impression que t'as coder au pif , c'est vrai que l'ordre des déclarations c'est d'aucune importance.
    Je code pas au pif !!!!! sinon j'aurais des milliers de fautes lors de la compilation !!! en effet, tu peut remarquer que le passage par adresse de la structure sockaddr_in de la socket marche Nickel mais elle est déclarée localement dans le main !! c'est pourquoi j'ai soupçonné la structure Compteur!!!!!!!

    T'auras proposé une solution si t'as bien compris le problème !!!!!!!!!!!!!!!!

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Alors en C , ça peut marcher sans soucis sans pour autant que le code soit très correct.
    Sinon je maintiens mes propos oui tu code n'importe comment en C (code dans .h les type de structure ont le même nom que les variables ect).
    Compteur n'est pas défini quand il tombe dans train.h et non Compteur n'est pas une variable global juste une structure (et sa définition se trouve dans train.c).

    Alors j'aime pas proposer des solution pour bidouiller mais Compteur doit être définir dans le .h
    Mais le code n'est toujours pas correct en 'bon' C , alors si on plus ça doit devenir un homework ça commence mal.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    je l' ai résolu depuis hier : c'est un problème d'allocation dynamique

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Quelle chance.
    Et si d'aventure quelqu'un avait ton problème, il serait heureux de savoir comment tu l'as résolu.

    L'entraide repose sur l'échange. Maintenant que nous t'avons donné de notre temps, donnes nous du tien.
    Décris-nous donc comment tu t'y es pris, merci!
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Serveur Web et Serveur d'Applications
    Par ahmedpa dans le forum Java EE
    Réponses: 6
    Dernier message: 18/08/2012, 12h10
  2. Aide sur serveur web et serveur d application
    Par prugne dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 25/02/2009, 09h46
  3. [ Tomcat ] serveur d'application!!serveur web!!
    Par miagomiago dans le forum Tomcat et TomEE
    Réponses: 10
    Dernier message: 03/01/2006, 17h07
  4. Serveur Web ou serveur d'applications ?
    Par trax020 dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 4
    Dernier message: 02/11/2005, 11h27
  5. serveur d'application
    Par nass_03 dans le forum JBuilder
    Réponses: 3
    Dernier message: 20/01/2003, 16h34

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