Partage
  • Partager sur Facebook
  • Partager sur Twitter

instructions en sortie de while non-éxecutées

    24 mars 2018 à 13:22:49

    Bonjour,

    voici mon soucis, j'ai une boucle while (lu != 0 && server_state != 0), elle semble fonctionner correctement jusqu'au moment où lu=0 à ce moment on ne fait pas un tour de boucle supplémentaire mais le programme n'éxecute pas les instructions suivantes.

    voici mon code C :

    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <audio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <string.h>
    #include <arpa/inet.h>
    
    
    int main (){
       
        int fd, err, errsend;
        struct sockaddr_in addr;
        struct sockaddr_in dest;
        char msg[12];
        socklen_t len, flen;
        struct sockaddr_in from;
        int wait = 0;
        int server_state = 0;
        int end;
       
        // Arguments lecteur
        ssize_t lu;
        char *buffer;
        char *filename = malloc(20 * sizeof(char));
        int sample_rate = 0;
        int sample_size = 0;
        int channels = 0;
        int apresEntete;
    
        // Argument traitement plusieurs clients à la suite
        int sel;
    
        // Arguments timeout
        int nb;
        fd_set watch_over;
        struct timeval timeout;
       
        while(1){
    
            fd = socket(AF_INET,SOCK_DGRAM,0);
       
            if(fd < 0){
                printf("Erreur creation socket"); // remplacer les printf avec des perror
            }
       
            // struct sockaddr_in du serveur
            addr.sin_family = AF_INET;
            addr.sin_port = htons(5555);
            addr.sin_addr.s_addr = htonl(INADDR_ANY);
       
       
            err = bind(fd, (struct sockaddr *) &addr, sizeof(struct sockaddr_in));
       
            if(err < 0){
                printf("Erreur Bind");
            }
       
            flen = sizeof(struct sockaddr_in);
    
            FD_ZERO(&watch_over);
            FD_SET(fd, &watch_over);
            sel = select(fd+1, &watch_over, NULL, NULL, NULL);
    
            if (sel > 0){
                if (FD_ISSET(fd, &watch_over)){
       
                    // Reception du filename
       
                    len = recvfrom(fd, filename, sizeof(filename), 0, (struct sockaddr*) &from, &flen);
    
                    // On regarde si le serveur traite déjà un client
    
                    if (server_state == 1)
                        printf("serveur busy for the moment, please try later");
    
                    else {
       
                        if(len < 0){
                            printf("Erreur recvfrom");
                        }
       
                        // On dit que le serveur est occupé avec un client
    
                        server_state = 1;
    
                        printf("Received %d bytes from host %s port %d: %s\n", err, inet_ntoa(from.sin_addr),
                            ntohs(from.sin_port), filename);
               
                        // Lecteur
    
                        apresEntete = aud_readinit(filename, &sample_rate, &sample_size, &channels);
       
                        // Envoi de sample_rate, sample_size et channels au client
       
                        errsend = sendto(fd, (void *) &sample_rate, sizeof(sample_rate) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
       
                        if (errsend < 0){
                            printf("Erreur sendto sample_rate");
                        }
       
                        printf("sample_rate : %d \n", sample_rate);
       
                        errsend = sendto(fd, (void *) &sample_size, sizeof(sample_size) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
       
                        if (errsend < 0){
                            printf("Erreur sendto sample_size");
                        }
       
                        printf("sample_size : %d \n", sample_size);
       
                        errsend = sendto(fd, (void *) &channels, sizeof(channels) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
       
                        if (errsend < 0){
                            printf("Erreur sendto channels");
                        }
       
                        printf("channels : %d \n", channels);
       
                        buffer = malloc(sample_size);
                        lu = read(apresEntete, buffer, sample_size);
       
                        // Boucle lu != 0 pour envoyer les echantillons
    
                        errsend = sendto(fd, buffer, sizeof(buffer) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
                       
                        while(lu != 0 && server_state != 0){
    
                            FD_ZERO(&watch_over);
                            FD_SET(fd, &watch_over);
                            timeout.tv_sec = 5;
                            timeout.tv_usec = 0;
                            nb = select(fd+1, &watch_over, NULL, NULL, &timeout);
    
                            if (nb==0){
                                server_state = 0;
                            }
    
                            else {
    
                                if (FD_ISSET(fd, &watch_over)){
                                    if (recvfrom(fd, msg, sizeof(msg), 0, (struct sockaddr*) &from, &flen)){
                                        errsend = sendto(fd, buffer, sizeof(buffer) + 1, 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
                                     }
                   
                                }
           
               
                                if (errsend < 0){
                                    printf("Erreur sendto");
                                }
                            }
           
                            lu = read(apresEntete, buffer, sample_size);
    
                        }
    
       
    
                        // On indique que le serveur peut traiter un autre client.
    
                        server_state = 0;
                       
                        // On indique la fin de la lecture en envoyer au client  NULL
                       
                        printf("fin de la lecture");
                        errsend = sendto(fd, NULL, sizeof(NULL), 0, (struct sockaddr*) &from, sizeof(struct sockaddr_in));
                   
                        }
                }
            }
        }
    
        end = close(fd);
        printf("la socket est fermée \n");
       
        if(end < 0){
            printf("Erreur close");
        }
       
        close(apresEntete);
        free(buffer);
        //A faire, fermer les malloc et les fichiers
       
       
    }   



    -
    Edité par ThibaudNaegele1 24 mars 2018 à 17:45:31

    • Partager sur Facebook
    • Partager sur Twitter
      24 mars 2018 à 14:06:56

      Hello,

      Poste ton code (convenablement indenté !) en utilisant le bouton </> de l'édietur du forum, et choisis c++ pour la coloration syntaxique. Merci.

      Là, c'est imbuvable.

      -
      Edité par edgarjacobs 24 mars 2018 à 14:07:47

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        24 mars 2018 à 17:47:35

        Désolé, j'ai édité mon message précédent, en espérant qu'il soit plus clair/lisible.
        • Partager sur Facebook
        • Partager sur Twitter
          24 mars 2018 à 19:04:36

          Re,-

          Prenons le cas, où, ligne 137, nb vaut zéro. Tu mets alors server_state à zéro et.... il y reste indéfiniment. Tu restes donc coincé dans le while, quelle que soit la valeur de lu

          -
          Edité par edgarjacobs 24 mars 2018 à 19:06:14

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            24 mars 2018 à 21:46:49

            Re,

            Merci de prendre le temps de m'aider.

            Je ne suis pas sur de comprendre, une fois "server_state = 0;" éffectué je devrais sortir du if, sauter le else et au prochain tour de boucle je ne respecte pas la condition du while alors je saute aux instructions suivantes non?

            • Partager sur Facebook
            • Partager sur Twitter
              24 mars 2018 à 23:47:59

              Re,

              Ouups, tu as raison, erreur de lecture de ma part.

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                25 mars 2018 à 11:18:39

                Supprime ton while(1), une bonne partie de ce qui se trouve a l'interieur ne me semble pas avoir a etre repeté inutilement.

                L122 un malloc sans free.. refait indéfiniment

                L176 quel fd fermes tu?

                (Les joies du while(1)...)

                • Partager sur Facebook
                • Partager sur Twitter
                ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                  25 mars 2018 à 12:40:23

                  Bonjour,

                  Merci de prendre le temps de m'aider,

                  Effectivement mon free était mal placé.

                  Je ferme le ld " fd = socket(AF_INET,SOCK_DGRAM,0); " L43

                  Toutes les instructions à 'lintérieur du while(1) sont censées traiter la demande de packets d'un client auquel on envoi échantillon par échantillon un .wav qu'il lit au fur et à mesure, une fois traitée je dois refaire un autre tour de boucle lorsqu'un autre client envoi une requête.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 mars 2018 à 13:23:35

                    188 lignes, il faudrait peut être découper en fonctions...  Ca permettrait de ne pas trop s'encombrer dans l'une avec les détails de l'autre.

                    -
                    Edité par michelbillaud 25 mars 2018 à 16:42:57

                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 mars 2018 à 19:02:08

                      ThibaudNaegele1 a écrit:

                      Je ferme le ld " fd = socket(AF_INET,SOCK_DGRAM,0); " L43


                      Celui ouvert à quel tour de boucle de while(1) ... ?

                      Egalement, ta ligne 169 me semble plus que suspecte... envoie un vrai message!

                      -
                      Edité par breizhbugs 25 mars 2018 à 19:11:55

                      • Partager sur Facebook
                      • Partager sur Twitter
                      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **

                      instructions en sortie de while non-éxecutées

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown