Envoi du tableau de longueur arbitraire à travers un socket. Endianité

Je me bats avec la programmation de socket et j’ai rencontré un problème que je ne sais pas résoudre de manière portable. La tâche est simple: je dois envoyer le tableau de 16 octets sur le réseau, le recevoir dans une application client et l’parsingr. Je sais, il existe des fonctions comme htonl, htons, et donc une à utiliser avec uint16 et uint32. Mais que dois-je faire avec les morceaux de données plus grandes que cela?

Je vous remercie.

Vous dites un tableau de 16 octets. Cela n’aide pas vraiment. La finalité ne compte que pour les choses plus grandes qu’un octet.

S’il s’agit vraiment d’octets bruts, envoyez-les simplement, vous les recevrez tout de même.

Si c’est vraiment une structure que vous voulez envoyer

struct msg { int foo; int bar; ..... 

Ensuite, vous devez travailler à travers le tampon en tirant les valeurs que vous voulez.

Lorsque vous envoyez, vous devez assembler un paquet dans un ordre standard

  int off = 0; *(int*)&buff[off] = htonl(foo); off += sizeof(int); *(int*)&buff[off] = htonl(bar); ... 

lorsque vous recevez

  int foo = ntohl((int)buff[off]); off += sizeof(int); int bar = ntohl((int)buff[off]); .... 

EDIT: Je vois que vous voulez envoyer une adresse IPv6, elles sont toujours dans l’ordre des octets du réseau – vous pouvez donc simplement les diffuser brutes.

L’endianisme est une propriété des variables multi-octets telles que les entiers 16 bits et 32 ​​bits. Il s’agit de savoir si l’octet d’ordre le plus élevé ou le plus faible va en premier. Si l’application client traite le tableau sous forme d’octets individuels, elle n’a pas à s’inquiéter de finalité, car l’ordre des bits dans les octets est le même.

htons , htonl , etc., sont destinés à traiter un seul élément de données (par exemple, un int) qui est supérieur à un octet. Un tableau d’octets où chacun est utilisé comme un élément de données unique (par exemple, une chaîne) n’a pas besoin d’être traduit entre l’ordre des octets de l’hôte et celui du réseau.

Les octets eux-mêmes n’ont plus d’endianisme en ce sens que tout octet transmis par un ordinateur aura la même valeur dans un ordinateur récepteur différent. L’endianisme n’a de pertinence que de nos jours avec les types de données multi-octets tels que ints

Dans votre cas particulier, il s’agit de savoir ce que le récepteur fera de vos 16 octets. S’il traite chacune des 16 entrées du tableau comme des valeurs discrètes à un octet, vous pouvez simplement les envoyer sans vous soucier des endiannes. Si, en revanche, le récepteur traite votre tableau de 16 octets comme quatre entiers 32 bits, vous devrez alors exécuter chaque entier via hton () avant de l’envoyer.

Est ce que ça aide?