Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème endianness lors de transfert d'image.

Sujet résolu
    13 juillet 2018 à 13:14:21

    Bonjour,

    je souhaite tranferer different screenshot d'un pc portable sous ubuntu vers un autre pc portable lui aussi sous Ubuntu.Les deux machines sont en little endian.

    Lorsque je test un transfert en local je n'ai aucun problème, par contre lorsque je test via le reseau, le programme me renvoit très vite des poids érronnés pour les screenshots, donc le transfert ne se fait pas correctement.

    Je pense qu'il faut utiliser les fonctions htonl et ntohl.J'ai fait quelques essais sans succés.

    Voici la portion de code en question :

    Coté server :

        do
        {
            file_name = malloc(32 * sizeof(gchar*));
            if(file_name == NULL)
            {
                error("malloc() file_name", "download_multi_screenshot_files()");
                exit(-1);
            }
    
            sprintf(file_name, "%ld", i);
            file_name = strcat(file_name, ".jpeg");
    
            if(strlen(file_name) > 32)
            {
                printf("Warning : risk of overflow, the programm will stop !!\n");
                exit(-1);
            }
    
            printf("\n\n\nfilename = %s\n\n\n", file_name);
    
            screenshot_file = fopen(file_name, "r");
            if(screenshot_file == NULL)
            {
                error("fopen() file_name", "download_multi_screenshot_files()");
                exit(-1);
            }
    
            /* weight of record file */
            fseek(screenshot_file, 0, SEEK_END);
            screen_weight = ftell(screenshot_file);
            rewind(screenshot_file);
    
            printf("\n\n\nle fichier screenshot fait : %d octets\n\n\n", screen_weight);
    
            if(send(csock, (char*)&screen_weight, sizeof(screen_weight), 0) == SOCKET_ERROR)
            {
                error("send() screen_weight", "download_multi_screenshot_files()");
                exit(-1);
            }
    
            do
            {
                dataRead = fread(buffer_desktop_screenshot, sizeof(char), 1450, screenshot_file);
    
                dataSend = send(csock, buffer_desktop_screenshot, 1450, 0);
                if(dataSend == 0)
                {
                    error("send() datasend", "download_multi_screenshot_files()");
                    exit(-1);
                }
    
                totalSend += dataRead;
    
            }while(totalSend < screen_weight);
    
            printf("\n\nEnvoie du screenshot SUCCESS !!\n");
    
            totalSend = 0;
            i++;
            j++;
            free(file_name);
    
        }while(i <= total_number_of_screenshot);


    Coté Client :

            do
            {
                printf("\nFilename  = %s\n", file_name[i]);
    
                printf("i = %d\nj = %d\n\n", i, j);
    
                screenshot_file = fopen(file_name[i], "wb");
                if(screenshot_file == NULL)
                {
                    error("fopen()", "ubuntu_multi_screenshot()");
                    exit(-1);
                }
    
                if(recv(sock, (char*)&data_len, sizeof(data_len), 0) == SOCKET_ERROR)
                {
                    error("recv() data_len", "ubuntu_multi_screenshot()");
                    exit(-1);
                }
    
                printf("le screenshot pèse : %d octets\n\n", data_len);
    
                do
                {
                    tailleBlockRecut = recv(sock, buffer, 1450, 0);
    
                    fwrite(buffer, sizeof(char), (size_t)tailleBlockRecut, screenshot_file);
    
                    totalRcv += tailleBlockRecut;
    
                    //printf("Dowlading : %.2f Mo\n\n", (double)totalRcv / 1000000);
    
                }while(totalRcv < data_len);
    
                printf("Reception du screenshot success !!!!\n");
    
                fclose(screenshot_file);
                totalRcv = 0;
                i++;
                j++;
    
            }while(j <= total_number_of_screenshot);


    Merci d'avance pour votre aide.

    -
    Edité par Code Rom 13 juillet 2018 à 16:23:25

    • Partager sur Facebook
    • Partager sur Twitter

    L'IA se détecte par des fautes d'orthographe on la bloque en lui répondant des choses sans sens.

      14 juillet 2018 à 15:16:00

      Personne ?

      Bon bah je vais m' y atteler seul.....

      -
      Edité par Code Rom 14 juillet 2018 à 23:00:46

      • Partager sur Facebook
      • Partager sur Twitter

      L'IA se détecte par des fautes d'orthographe on la bloque en lui répondant des choses sans sens.

        15 juillet 2018 à 16:03:42

        Je ne m'en sort pas ........ Pourquoi je ne reçois aucune aide ? j'en ai pourtant bien besoin.
        • Partager sur Facebook
        • Partager sur Twitter

        L'IA se détecte par des fautes d'orthographe on la bloque en lui répondant des choses sans sens.

          16 juillet 2018 à 10:00:19

          Salut,

          Quel type d'image envoies tu ?  EDIT ok vu jpg

          Peux tu uploader le fichier avant et après envoi ?

          Je ne suis pas sur que ce soit un problème d'endianness (au moins au niveau du transfert) car tu envoies un flux de char. Donc normalement tu devrais obtenir le même flux à la sortie.

          Non, le soucis vient de ton "r" dans le fopen -> met "rb". (et j'ai vu que tu as bien mis "wb" et pas "w")

          En effet, sous Windows, si tu es en mode "r" (mode texte) dès qu'il liras un 0x0D, il partira du principe qu'il y a un 0x0A après donc ignorera un octet.

          -
          Edité par Fvirtman 16 juillet 2018 à 10:02:52

          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            16 juillet 2018 à 14:07:42

            Salut Fvirtman merci pour ton aide, malheureusement j'avais déjà pensé a modifier en "rb" le problème persiste.

            Ce qui est bizard c'est que la premiere image s'envoies toujours correctement (le poid est le bon) , l'erreur survient sur le second ou troisième envoies.

            Voila ce que me sort le programme :

             Filename  = 1.jpeg
            i = 0
            j = 1
            
            le screenshot pèse : 263452 octets
            
            Reception du screenshot success !!!!
            
            Filename  = 2.jpeg
            i = 1
            j = 2
            
            le screenshot pèse : -6653627468721892084 octets
            
            Reception du screenshot success !!!!
            
            Filename  = 3.jpeg
            i = 2
            j = 3
            
            le screenshot pèse : -5365861226395288907 octets


            les poids sont irréel !!

            Que veux tu dire par :

            [quote]Peux tu uploader le fichier avant et après envoi ?[/quote]

            il y a peut être une piste a creuser.

            Merci a toi

            edit :

            En effet, sous Windows, si tu es en mode "r" (mode texte) dès qu'il liras un 0x0D, il partira du principe qu'il y a un 0x0A après donc ignorera un octet

            Je suis sous linux ubuntu :)

            -
            Edité par Code Rom 16 juillet 2018 à 14:19:49

            • Partager sur Facebook
            • Partager sur Twitter

            L'IA se détecte par des fautes d'orthographe on la bloque en lui répondant des choses sans sens.

              16 juillet 2018 à 14:46:24

              Hello,

              server, ligne 45: quelque soit la taille lue, tu envoies 1450 bytes, ce qui va fausser la taille du fichier en réception.

              Mais je ne pense pas que l'erreur vienne de là.

              Tu n'en parles pas, mais je suppose que du côté serveur, la taille du fichier que tu affiches (ligne 33) est bien la bonne ?

              Les types de screen_weight et data_len ont-ils la même taille (bien que je suppose que oui).

              -
              Edité par edgarjacobs 16 juillet 2018 à 14:46:37

              • 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

                16 juillet 2018 à 15:08:47

                "Tu n'en parles pas, mais je suppose que du côté serveur, la taille du fichier que tu affiches (ligne 33) est bien la bonne ?"

                Oui de ce coté là aucune erreur.


                "Les types de screen_weight et data_len ont-ils la même taille (bien que je suppose que oui)."

                Oui j'ai opté pour des long.


                "server, ligne 45: quelque soit la taille lue, tu envoies 1450 bytes, ce qui va fausser la taille du fichier en réception."

                Je vais corriger ça, merci.

                -
                Edité par Code Rom 16 juillet 2018 à 15:09:02

                • Partager sur Facebook
                • Partager sur Twitter

                L'IA se détecte par des fautes d'orthographe on la bloque en lui répondant des choses sans sens.

                  16 juillet 2018 à 23:34:06

                  Bonsoir,

                  Il y des anomalies dès le début du code.
                  D'abord, le sizeof ligne 3, pourquoi un type pointeur alors qu'on alloue apparemment de la RAM pour des caractères?
                  Lignes 10 et 11, pourquoi ne pas tout faire dans le sprintf?
                  Lignes 13 à 17, ce test ne rime à rien, l'éventuel dépassement a déjà eu lieu.
                  Ligne 21, manquait le "b" comme déjà signalé.
                  Lignes 22-26, il faudrait afficher la cause de l'erreur (avec fonction perror par exemple).
                  Ligne 33, devrait afficher un long, pas un int (voir manuel de ftell).
                  Ligne 35, envoi direct d'une donnée binaire, ça pue. Il faudrait gérer les problèmes d'endianess et de taille de type. Ou alors la solution simple, sérialiser en ASCII pour envoyer.
                  Ligne 44, et la gestion des erreurs de fread alors?
                  ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 juillet 2018 à 1:13:31

                    OKay alors déjà vous pourriez être plus courtois car vos remaque porte sur des erreurs minime, le "ça pue" de votre texte me fait dire que vous avait la rage on sais pas trop pourquoi.De plus vous n'apportez aucunes solutions juste de la rage inutile, merci la prochaine fois d'être plus aimable envers moi.....

                    Mais reprenons puisqu'il le faut .........

                    "D'abord, le sizeof ligne 3, pourquoi un type pointeur alors qu'on alloue apparemment de la RAM pour des caractères?"

                    Je suis d'accord c'est une erreur qui est déjà corrigé je ne vous ai pas attendu.

                    "Lignes 10 et 11, pourquoi ne pas tout faire dans le sprintf?"

                    Est ce que ça change vraiment le smilblick....je ne pense pas.....

                    "Lignes 13 à 17, ce test ne rime à rien, l'éventuel dépassement a déjà eu lieu."

                    Certes, je suis autodidacte et pas du tout un programmeur expérimenté il m'arrive de faire encore des erreurs.

                    "Ligne 21, manquait le "b" comme déjà signalé."

                    Déjà corrigé il ya bien longtemps....cf mon avant dernier post......la rage vous aveugle ?

                    "Lignes 22-26, il faudrait afficher la cause de l'erreur (avec fonction perror par exemple)."

                    Enfin quelque chose de constructif, je vous en remercie, je note ça et je ferais les test necessaire, merci a vous.

                    "Ligne 33, devrait afficher un long, pas un int (voir manuel de ftell)."

                    Minuscule erreur de ma part qui a etait aussi corrigé il y a bien longtemps.

                    "Ligne 35, envoi direct d'une donnée binaire, ça pue. Il faudrait gérer les problèmes"

                    Un peu de respect s'il vous plais.......Quelles sont vos propositions car pour moi l'envoies est correct, je vous le redis je ne suis pas expérimenté et autodidacte j'ai encore beaucoup de chose a apprendre.

                    "Ligne 44, et la gestion des erreurs de fread alors?"

                    Oui un oublie de ma part, mais encore une fois ça ne change pas le sujet du problème.

                    Alors s'il vous plais montrez un peu plus de politesse a mon egard et essayez s'il vous plais d'apporter des solutions au problème posé et non pas de faire le compilateur sur patte soulignant la moindre erreur voir même warning insignifiant, que cherchez vous a prouver ......

                    -
                    Edité par Code Rom 17 juillet 2018 à 1:23:34

                    • Partager sur Facebook
                    • Partager sur Twitter

                    L'IA se détecte par des fautes d'orthographe on la bloque en lui répondant des choses sans sens.

                      17 juillet 2018 à 2:30:14

                      Code Rom a écrit:

                      OKay alors déjà vous pourriez être plus courtois car vos remaque porte sur des erreurs minime, le "ça pue" de votre texte me fait dire que vous avait la rage on sais pas trop pourquoi.

                      En fait c'est une référence à https://fr.wikipedia.org/wiki/Code_smell

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 juillet 2018 à 9:13:22

                        Salut !

                        Du coup, si tu as corrigé plusieurs trucs et que ça ne marche toujours pas, reposte ton code modifié, qu'on puisse regarder de nouveau :)

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                          17 juillet 2018 à 10:54:31

                          C'est bon j'ai corrigé le problème.

                          Voici le code qui fonctionne

                          Server :

                          do
                              {
                                  file_name = malloc(32 * sizeof(gchar));
                                  if(file_name == NULL)
                                  {
                                      error("malloc() file_name", "download_multi_screenshot_files()");
                                      exit(-1);
                                  }
                          
                                  snprintf(file_name, 32, "%ld.jpeg", i);
                          
                                  //file_name = strcat(file_name, ".jpeg");
                          
                                  printf("\nfilename = %s\n", file_name);
                          
                                  screenshot_file = fopen(file_name, "rb");
                                  if(screenshot_file == NULL)
                                  {
                                      error("fopen() file_name", "download_multi_screenshot_files()");
                                      exit(-1);
                                  }
                          
                                  /* weight of screenshot file */
                                  fseek(screenshot_file, 0, SEEK_END);
                                  screen_weight = (size_t)ftell(screenshot_file);
                                  rewind(screenshot_file);
                          
                                  printf("\nle fichier screenshot fait : %ld octets\n", screen_weight);
                          
                                  if(send(csock, (char*)&screen_weight, sizeof(screen_weight), 0) == SOCKET_ERROR)
                                  {
                                      error("send() screen_weight", "download_multi_screenshot_files()");
                                      exit(-1);
                                  }
                          
                                  do
                                  {
                                      dataRead = fread(buffer_desktop_screenshot, sizeof(char), sizeof(screen_weight), screenshot_file);
                                      if(dataRead == 0)
                                      {
                                          error("send() dataRead", "download_multi_screenshot_files()");
                                          exit(-1);
                                      }
                          
                                      dataSend = send(csock, buffer_desktop_screenshot, sizeof(screen_weight), 0);
                                      if(dataSend == 0)
                                      {
                                          error("send() datasend", "download_multi_screenshot_files()");
                                          exit(-1);
                                      }
                          
                                      totalSend += dataRead;
                          
                                  }while(totalSend < screen_weight);
                          
                                  printf("\nEnvoie du screenshot SUCCESS !!\n");
                          
                                  totalSend = 0;
                                  //free(file_name);
                                  fclose(screenshot_file);
                          
                                  i++;
                                  j++;
                          
                              }while(i <= total_number_of_screenshot);
                          

                          Client :

                                  do
                                  {
                                      j++;
                          
                                      if(recv(sock, (char*)&data_len, sizeof(data_len), 0) == SOCKET_ERROR)
                                      {
                                          error("recv() data_len", "ubuntu_multi_screenshot()");
                                          exit(-1);
                                      }
                          
                                      printf("\nFilename  = %s\n", file_name[i]);
                          
                                      printf("i = %d\nj = %d\n\n", i, j);
                          
                                      screenshot_file = fopen(file_name[i], "wb");
                                      if(screenshot_file == NULL)
                                      {
                                          error("fopen()", "ubuntu_multi_screenshot()");
                                          exit(-1);
                                      }
                          
                                      printf("le screenshot pèse : %ld octets\n\n", data_len);
                          
                                      do
                                      {
                                          tailleBlockRecut = recv(sock, buffer, sizeof(data_len), 0);
                          
                                          fwrite(buffer, sizeof(char), (size_t)tailleBlockRecut, screenshot_file);
                          
                                          totalRcv += (size_t)tailleBlockRecut;
                          
                                          //printf("Downloading : %.2f Mo\n\n", (double)totalRcv / 1000000);
                          
                                      }while(totalRcv < data_len);
                          
                                      printf("Reception du screenshot success !!!!\n");
                          
                                      fclose(screenshot_file);
                                      totalRcv = 0;
                                      i++;
                          
                                  }while(j < total_number_of_screenshot);

                          Merci a vous tous pour votre aide, sans vous je n'aurais pas trouvé.


                          -
                          Edité par Code Rom 18 juillet 2018 à 2:28:11

                          • Partager sur Facebook
                          • Partager sur Twitter

                          L'IA se détecte par des fautes d'orthographe on la bloque en lui répondant des choses sans sens.

                          problème endianness lors de transfert d'image.

                          × 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