Petit bogue sur un buffer [C] - C - Programmation
Marsh Posté le 05-03-2012 à 10:12:40
Bonjour,
link953 a écrit :
|
htohl ? Ca compile, ca ? J'imagine que tu voulais dire ntohl ?
Du côté de l'émission, tu as bien utilisé htonl sur ton int ?
link953 a écrit :
|
Ton goto ne sert absolument à rien ! Il n’apparaît qu'en fin de boucle et renvoie sur l'instruction qui suit... Autant ne pas le mettre !
Bon, sinon, attention aussi avec les int ! La taille sur laquelle ils sont codés dépend du système:
système 64 bits => 8 octets
système 32 bits => 4 octets
Commence par t'assurer que tu envoies et reçois bien la taille sur le même nombre d'octets, sinon tu risques d'avoir des surprises.
Marsh Posté le 05-03-2012 à 13:34:53
Salut merci de ta réponse,
Non c'est une erreur..j'utilise bien ntohl. En rechanche je n'utilise rien à l'émission. Sur la tablette Android donc en java l'envoi se fait avec WriteInt et c'est gérer dedans il me semble.
Le goto sert en faite mais il est impossible de le voir je n'ai pas mis tout le source pour ne pas trop prendre la tête aux personnes qui essaient de m'aider.
J'ai déjà fait les tests et la réception de la taille est nickel.
En fessant des tests je pense avoir trouvé la solution.
J'utilise un malloc :
unsigned char buffer;
buffer = malloc(taille_buffer);
De cette façon je donne dynamiquement une taille au buffer.
Ensuite pour le recv qu'il ne ce vide pas...c'est juste que je suis un boulet.
Je lis 8 caractères et ensuite 0 et si je boucle pour afficher plusieurs fois le recv tout ce passe bien recv renvoi 0 et si j'affiche encore quelque chose c'est que mon buffer n'a pas été vidé tout simplement.
Voilà qu'en pensez-vous.
Marsh Posté le 05-03-2012 à 18:24:25
Ton sizeof(buffer) est une constante qui te renvoie 8 (Sur une archi 64bits, car c'est la taille d'un pointeur qui est renvoyé, pas la taille de la zone allouée). Donc, si tu alloue une taille de "taille_buffer", bah, alors tente de lire "taille_buffer" octets avec recv et pas sizeof(buffer).
D'ailleurs, il serait sage de faire une boucle dans la réception. Il me semble que recv peut retourner avec moins de données qu'il n'a été envoyé (MTU, etc...). Bref un truc du genre:
Code :
|
Disclaimeur: pas trop testé cela dit...
Edit: ouais, en fait non, la boucle est inutile.
Marsh Posté le 07-03-2012 à 10:25:15
Salut!
Alors j'ai gratté de mon coté ( je n'aime pas attendre la solution sagement et j'ai écris ceci:
Code :
|
Qu'en pensez vous?
Marsh Posté le 04-03-2012 à 14:12:36
Salut à tous.
Voilà, j'ai une socket entre un tablette android et un serveur multi-thread en C qui tourne sur un linux. La tablette envoie un fichier. Donc pour ce faire j'envoi la taille de la chaine de caractère qui compose le nom du fichier, puis la chaine en elle-même, ensuite la taille du fichier puis le fichier en lui-même.
De cette façon je pourrais ouvrir un fichier du coté serveur avec le même nom que celui sur la tablette, et y verser le contenue du fichier dedans.
Bon je suis un padawan en c et mon souci est que quand je declare mon buffer avec la taille ( soit de la chaine soit du fichier ) et que je boucle sur le recv, je m'aperçois qu'il ne se vide pas. En revanche si je declare le buffer avec un valeur fichier ( genre char buffer[8] au lieu de char buffer[taille] ) la le recv se vide.
De même si j'envoi le nom du fichier puis le fichier j'ai une erreur genre trap quelque chose mais si j'envoi le fichier puis le nom du fichier la sa roule ( surement parce que la taille du buffer est plus grande pour le fichier que pour la chaine.
Enfin je sais pas si je suis clair. Je vous donne le code source du thread du serveur pour que vous puissiez y jeter un coup d'oeil.
En tout cas merci à vous!