Pb d'envoi de la valeur 0x00 via réseau
Résolu
frufu
Messages postés
3
Date d'inscription
Statut
Membre
Dernière intervention
-
frufu Messages postés 3 Date d'inscription Statut Membre Dernière intervention -
frufu Messages postés 3 Date d'inscription Statut Membre Dernière intervention -
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.
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.
A voir également:
- Pb d'envoi de la valeur 0x00 via réseau
- Mot de passe reseau - Guide
- Cable reseau player freebox - Forum Freebox
- Le message n'a pas été envoyé car le service n'est pas activé sur le réseau - Forum Xiaomi
- Envoi impossible messenger - Forum Facebook Messenger
- Messenger en attente de réseau ✓ - Forum Facebook
2 réponses
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.
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.
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
1 584
Je suggère de remplacer
par .