Partage
  • Partager sur Facebook
  • Partager sur Twitter

[socket] machine qui receptionne mal les donnees

Sujet résolu
    22 mars 2019 à 14:42:41

    Bonjour,

    Alors petit soucis sur le quel je but depuis 3 jours, je suis entrain de coder un client/serveur, classique, chose que j'ai déjà fait plusieurs fois.
    seulement pour une raison que j'ignore, mon serveur réceptionne uniquement une partie de mon buffer, j'ai donc passer 3 jours dessus a essayer de comprendre, changer mon code etc.. puis je demande a un pote qu'il m'aide, il le lance simplement et la... ça fonctionne ! o_O sauf pour moi..
    donc j'ai fait plusieurs tests, en changeant de réseaux, en me mettant sur une vm etc et rien toujours le même résultat, le buffer est tronquer pour moi uniquement (a savoir que nous somme tout les deux sur les dernières version de ubuntu/gcc etc)

    du coup si vous avez des idées de pourquoi mon pc uniquement n'arrive pas a recevoir les données correctement, sachant que tout mes autres programme fonctionnaient bien.
    (oui je n'ai que ça comme info a donner, le code n'est pas nécessaire, comme expliquer le problème de vient pas de la mais de ma machine, potentiellement quelque chose qui n'est pas a jour peut être, même si j'ai tout update/upgrade)

    bye.
    • Partager sur Facebook
    • Partager sur Twitter
      22 mars 2019 à 15:09:14

      ça peut quand même venir du code (une question de buffer et de ram), mais c'est quand même étrange.

      hypothétiquement chez ton pote ça peut tomber en marche, alors que chez toi ça casse direct. ce serait un vrai problème de réseau tu n'aurais pas internet (enfin logiquement).

      -
      Edité par ox223252 22 mars 2019 à 15:10:34

      • Partager sur Facebook
      • Partager sur Twitter

      la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

      Mon GitHub

        22 mars 2019 à 15:17:38

        Bon du coup je le met quand même au cas ou

        int	send_net(SOCKET socket, const char *buffer)
        {
        	if (send(socket, ft_itoa(strlen(buffer) + 1), strlen(ft_itoa(strlen(buffer))) + 1, 0) == -1)
        	{
        		perror("send size");
        		return -1;
        	}
        
        	if (send(socket, buffer, strlen(buffer) + 1, 0) == -1)
        	{
        		perror("send buffer");
        		return -1;
        	}
        	return 0;
        }
        char	*recv_net(SOCKET socket)
        {
        	unsigned int size;
        	char *buffer = NULL;
        	int bytes = 0;
        
        	buffer = calloc(6, sizeof(char));
        
        	if ((bytes = recv(socket, buffer, 6, 0)) == -1)
        	{
        		perror("recv size");
        		return NULL;
        	}
        
        	size = atoi(buffer);
        	buffer = realloc(buffer, sizeof(char) * size);
        	bzero(buffer, size);
        	
        
        	if ((bytes = recv(socket, buffer, sizeof(char) * size, 0)) == -1)
        	{
        		perror("recv buffer");
        		return NULL;
            }
        	return buffer;
        }
        



        -
        Edité par Sta' 22 mars 2019 à 15:27:58

        • Partager sur Facebook
        • Partager sur Twitter
          22 mars 2019 à 15:20:51

          question bête, mais buffer c'est bien une chaine de caractère et pas une donnée (variable/structure/…) ? 

          EDIT : dans le second code buffer (size linge 15) fait bien la taille de ta donnée ?

          -
          Edité par ox223252 22 mars 2019 à 15:22:16

          • Partager sur Facebook
          • Partager sur Twitter

          la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

          Mon GitHub

            22 mars 2019 à 15:27:22

            ox223252 a écrit:

            question bête, mais buffer c'est bien une chaine de caractère et pas une donnée (variable/structure/…) ? 

            EDIT : dans le second code buffer (size linge 15) fait bien la taille de ta donnée ?

            -
            Edité par ox223252 il y a 2 minutes


            oui c'est bien une chaîne de char et oui il prends bien la taille de ma donnée, j'ai tout tester a coup de printf, ça vient vraiment de ma machine de ce que je vois perso :/
            • Partager sur Facebook
            • Partager sur Twitter
              22 mars 2019 à 15:33:48

              Il ne retourne pas d'erreur ? et byte = size ou byte = strlen ( buffer ) ?

              -
              Edité par ox223252 22 mars 2019 à 15:34:02

              • Partager sur Facebook
              • Partager sur Twitter

              la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

              Mon GitHub

                22 mars 2019 à 15:38:27

                ox223252 a écrit:

                Il ne retourne pas d'erreur ? et byte = size ou byte = strlen ( buffer ) ?

                -
                Edité par ox223252 il y a moins de 30s


                non aucune erreur, bytes vaut la valeur retourner par recv, mais n'est pas nécessaire, je l'ai mis par précaution je ne sais plus pourquoi mais je peux m'en passer.
                • Partager sur Facebook
                • Partager sur Twitter
                  22 mars 2019 à 15:56:33

                  en fait ma question était de savoir si valeur de  byte était la même que size ou la meme que strlen ( buffer ). Je te disais qu'il était peut probable que ça vienne de la machine car le problème existerais pour toutes tes connexion y compris internet (enfin ça parait logique, non ? ).

                  Edit : Il y a pas un autre soft sur même port qui récupèrerait une partie des données ?

                  -
                  Edité par ox223252 22 mars 2019 à 15:57:52

                  • Partager sur Facebook
                  • Partager sur Twitter

                  la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                  Mon GitHub

                    22 mars 2019 à 16:05:36

                    je ne comprends pas ta question pour bytes, bytes vaut la valeur retourner par recv soit le nombres d'octet reçus donc logiquement strlen(buffer) et size vaut strlen(buffer) + 1 donc c'est kiff kiff
                    et oui vu comme ça le problème serait le même pour tout le reste mais comme je l'ai dit mon pote ne la pas, avec exactement le code o_O
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 mars 2019 à 16:10:31

                      la question pour bytes c'était pour savoir si : recv recevait la moitié des donnés ou s'il recevait tout mais que c'est dans le buffer que ça foirait.

                      donc si bytes == strlen ( buffer ) et size == strlen ( buffer ) +1 alors c'est que tout est reçu, donc le problème ne viendrait pas de la transmission.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                      Mon GitHub

                        22 mars 2019 à 16:31:06

                        Apres test non effectivement bytes vaut moins (il vaut se que je reçois donc mon buffer tronquer) mais la encore mon pote contrairement a moi reçois tout :x
                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 mars 2019 à 17:22:29

                          Hello,

                          Tu dis que buffer est tronqué en réception. Mais ce n'est pas sur. Es-tu certain que le buffer envoyé soit bien celui que tu penses ? J'imagine un problème externe à à ta fonction send_net(), et qui ferait que le buffer passé à send_net() ne soit pas celui que tu imagines.

                          As-tu vérifier ce que valait buffer avant l'envoi par send_net() ?

                          Au fait, l'affirmation "chez mon pote ça fonctionne", ne sert à rien. J'ai connu des programmes identiques fonctionnant sur des machines identiques et ayant des comportements différents.

                          • 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

                            22 mars 2019 à 19:50:14

                            Eh oui justement c'est ce que j'essaye de dire ! Ils sont identiques et ne fonctionne pas pareil

                            Et oui j'ai tout testé a gros coup de printf c'est pour ça que je poste ici sinon je ne demande jamais d'aide

                            EDIT: je viens de remarquer, que je perds constamment les 3 premier caractères

                            -
                            Edité par Sta' 23 mars 2019 à 11:06:45

                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 mars 2019 à 12:09:57

                              pas plus d’idée ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 mars 2019 à 13:29:00

                                maintenant qu'on sais que c'est pas après la fonction recv que le problème ce passe, on peux vérifier la transmission, avec wireshark regarde si le message transmis est celui qui transite ou si il est tronqué.

                                En gros si tu reçois la moitié du message est parce que tu en à transmis que la moitié ?

                                PS quel est la taille du message de test ?

                                • Partager sur Facebook
                                • Partager sur Twitter

                                la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                                Mon GitHub

                                  25 mars 2019 à 14:29:06

                                  effectivement j'ai oublier que wireshark existait, par contre je sais capturer les paquets mais je ne sais pas trouver la data envoyer :/

                                  EDIT: alors j'ai bien trouver la data, je vois que pour l’envoie, la donnée envoyer est bonne, par contre la réception rien n'est afficher

                                  sinon send envois bien tout c'est bien au niveau de la réception que ça ne va pas (ou entre)
                                  la taille du message et de 14char

                                  -
                                  Edité par Sta' 25 mars 2019 à 14:53:21

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    25 mars 2019 à 15:57:44

                                    je te demandais la taille de la donnée car il me semble avoir lu quelque par qu'on pouvais régler la taille du buffer d'entré pour les requêtes TCP, mais là ...

                                    Donc bon si on recapitule, la donnée est correctement envoyé et transmise. seule une partie est vue par recv, cette partie est correctement traité par la suite.

                                    -> on peux en déduire que le problème (logiquement) se trouve au niveau du recv.

                                    -> question je sais plus si tu l'as fais as tu vérifié le retour de errno après le recv ?

                                    -> essais d'utiliser le flag MSG_WAITALL pour le recv (voir si il attend bien ou s'il quitte quand même).

                                    PS : Question con mais tu envoie la taille sous forme de string suivie de la donnée la taille envoyé ai bien la bonne :) ? Seconde question pourquoi l'envoyer sous forme de string et pas de int ?

                                    EDIT : tu as regardé du coté de la gestion d'erreur socket ? genre MSG_ERRQUEUE et recvmsg() ?


                                    -
                                    Edité par ox223252 25 mars 2019 à 16:00:02

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                                    Mon GitHub

                                      25 mars 2019 à 16:29:41

                                      Alors, j'utilise déjà le flag MSG_WAITALL (le code plus haut n'est plus a jour) j'ai aussi essayer d'utiliser le flag MSG_PEEK et boucler tant que le nombre d'octet reçus est différent de celui prévus, seulement ça ne change rien, c'est a dire que le message stocker sur la socket est déjà tronquer (le problème serais juste avant recv() ?)

                                      et sinon oui la taille est la bonne et pourquoi en string ? je ne sais pas enfaîte ^^'

                                      aucune erreur du cote de errno

                                      je n'ai pas regarder avec recvmsg, je suis entrain de le faire, mais vais continuer de le tester plus tard.

                                      EDIT:

                                      BON
                                      J'ai fini par résoudre le problème :D
                                      enfaîte je lis les caractère 1 par 1

                                      char	*recv_net(SOCKET socket)
                                      {
                                      	unsigned int size;
                                      	char *buffer = NULL;
                                      	int bytes = 0;
                                      	char c;
                                      	int i = 0;
                                      
                                      	buffer = calloc(6, sizeof(char));
                                      
                                      	do 
                                      	{
                                      		bytes = recv(socket, &c, 1, MSG_WAITALL);
                                      		if (bytes == -1)
                                      		{
                                      			perror("recv size");
                                      			return NULL;
                                      		}
                                      		buffer[i++] = c;
                                      	} while (c != 0);
                                      
                                      	size = atoi(buffer);
                                      	buffer = realloc(buffer, sizeof(char) * size);
                                      	bzero(buffer, size);
                                      
                                      	i = 0;
                                      	do
                                      	{
                                      		bytes = recv(socket, &c, 1, MSG_WAITALL);
                                      		if (bytes == -1)
                                      		{
                                      			perror("recv buffer");
                                      			return NULL;
                                      		}
                                      		buffer[i++] = c;
                                      	} while (c != 0);
                                      	return buffer;
                                      }

                                      -
                                      Edité par Sta' 25 mars 2019 à 20:05:12

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        25 mars 2019 à 20:20:04

                                        ok c'est corrigé, mais tu as trouvé pk ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                                        Mon GitHub

                                          25 mars 2019 à 23:07:27

                                          ox223252 a écrit:

                                          ok c'est corrigé, mais tu as trouvé pk ?


                                          ça serait du fait que je lise X nombres d'octet sans connaître combien j'en envois, notamment  sur le premier recv, du coup en les prenants 1 par 1 je peux savoir quand stopper avec le '\0'
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            25 mars 2019 à 23:55:04

                                            Sta' a écrit:

                                            ça serait du fait que je lise X nombres d'octet sans connaître combien j'en envois, notamment  sur le premier recv, du coup en les prenants 1 par 1 je peux savoir quand stopper avec le '\0'

                                            Je n'y crois pas un seul instant.

                                            Quand tu envoies des infos via le net, seul le programme expéditeur connait le nombre d'octets qu'il envoie, le côté récepteur ne connaitra le nombre d'octets envoyé qu'après le nbytes=revc(....);



                                            • 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

                                              26 mars 2019 à 7:09:45

                                              idem ça me semble etrange, ce que tu as trouvé serai plus un symptome plutôt que la cause.

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                                              Mon GitHub

                                                27 mars 2019 à 0:01:03

                                                ouais bah après je sais pas d’où ça peut venir :/
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                [socket] machine qui receptionne mal les donnees

                                                × 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