Pb d'envoi de la valeur 0x00 via réseau

Résolu/Fermé
frufu Messages postés 3 Date d'inscription vendredi 23 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016 - 23 déc. 2016 à 15:47
frufu Messages postés 3 Date d'inscription vendredi 23 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016 - 23 déc. 2016 à 22:44
Bonjour à tou(te)s

Je travaille en C++ sous Dev C++ sous windows 7.

Cela fait plusieurs jours que je butte sur un problème (j'écume les forums en ce moment).
Je dois transmettre des valeurs en UDP multicast selon un format bien précis (int sur 4 octets, int sur 8 octets, float sur 4 octets...)
Pour controler les valeurs transmises j'affiche la trame et j'effectue un espionnage via Wireshark.

Mon soucis concerne la valeur 0x00. Celle-ci s'enregistre correctement dans ma trame car j'arrive à bien l'afficher dans ma console par contre impossible de la retrouver dans Wireshark (message "MISSING_DATA: not enough data to read type").
Si je remplace 0x00 par n'importe qu'elle autre je n'ai plus aucun soucis de transmission (mais du coup le logiciel recevant l'information ne comprend plus rien :s )

voici un extrait de mon code :
(j'ai supp l'initialisation socket pour alléger le post car (à prioris) pas de pb de transmission vu que je vois passer mes trames sur Wireshark)

int main(void)
{
unsigned int HEADER = 100;
unsigned int LENGHT=20;
unsigned int VAL_1= 5; // valeur pour l'exemple
unsigned int VAL_2= 10; // valeur pour l'exemple
int i=0;
char message[512];

sprintf(message,"%4c%4c%4c%8c",HEADER,LENGHT,VAL_1,VAL_2); // %4 pour respecter mes 4 octets, par contre je m'aperçois qu'il m'enregistre des 0x20 pour combler les "vides".

do // du coup je me fais une petite boucle pour remettre de 0x00 à la place des 0x20
{
if (message[i] == 0x20)
{message[i] = 0x00;} //message[ascii]-0x26;}
i++;
}while(i!=511);

printf("message = %s\n 1er octet= 0x%x \n 2eme octet = 0x%x \n\n", message, message[0], message[3]); // la j'ai la trame qu'il me faut avec bien mes 0x00 et 0x64 pour ma valeur 100

if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
{
printf("sendto() failed with error code : %d" , WSAGetLastError());
system("pause");
exit(EXIT_FAILURE);
}
}

Si je laisse 0x20 je retrouve bien mes valeurs dans Wireshark mais moi j'ai besoin de 0x00

Merci d'avance pour les ames charitables qui auraient un peu de temps (et de connaissances ;)) à me consacrer.

2 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
23 déc. 2016 à 19:49
Bonjour,

Emettre des octets sur un réseaux, ça n'est pas émettre des caractères.
Il ne faut pas utiliser strlen(message) qui s'arrête au premier 0x00.
Il faut à la placer indiquer le nombre d'octets à transmettre.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
23 déc. 2016 à 20:06
Je suggère de remplacer
strlen(message)
par
LENGHT
.
0
frufu Messages postés 3 Date d'inscription vendredi 23 décembre 2016 Statut Membre Dernière intervention 27 décembre 2016
Modifié par frufu le 23/12/2016 à 22:44
Grand merci à vous deux pour votre réponse qui a solutionné mon souci !!!

(quand je pense au temps que j'y ai passé avant de poster... argghhh)
0