Bonjour les gars J'ai du mal à comprendre l'ordre des octets réseau et l'ordre dans lequel les données sont envoyées et reçues via UDP. J'utilise C#Envoi de paquets UDP dans le bon Endianness
J'ai une tenue de la structure:
message.start_id = 0x7777CCCC;
message.message _id = 0xBBB67000;
more data
la définition du message a [StructLayout(LayoutKind.Sequential)]
J'ai d'abord convertir la structure à un tableau d'octets en utilisant:
public byte[] StructureToByteArray(object obj)
{
int len = Marshal.SizeOf(obj);
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(obj, ptr, true);
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
return arr;
}
Et alors je vérifie pour l'endianness:
if (BitConverter.IsLittleEndian)
{
Array.Reverse(packet);
}
puis-je l'envoyer
socket.SendTo(packet, endPoint);
Quand j'envoie ce la réception reçoit le message avec le boutisme correct appliqué, mais les octets dans l'ordre inverse, en regardant si dans Wireshark je reçois:
le reste. ................. BBB67000 7777CCCC
quand j'attends: 7777CCCC BBB67000 ................... .le reste
Est ce que je m'attends à droite ou est-ce normal que le premier octet dans le st la structure est la dernière à arriver?
Merci beaucoup
L'endianness ne devrait pas être appliqué sur l'ensemble du paquet - il devrait être appliqué sur les parties individuelles ... Je pense que c'est sur tous les 32 bits, mais je ne suis pas à 100% sur ce point. –
Presque ce que Michael Bray a dit. Endianness est appliqué sur les parties individuelles (donc séparément pour 'start_id' et' message_id'), et il est au niveau de l'octet (donc dans un int de 4 octets, le 1er avec le 4ème octet sont échangés, et le 2ème avec le 3ème) – xanatos