Ordre des octets du réseau dans les sockets

J’apprends à programmer des sockets sous c (Linux) et je ne comprends pas vraiment pourquoi il est nécessaire d’utiliser htonl lorsque vous envoyez un entier, mais pas lorsque vous envoyez une chaîne (char *). J’ai lu beaucoup de journaux, mais je ne sais toujours pas pourquoi.

C’est parce que les données envoyées via les réseaux sont envoyées dans l’ordre Big Endian. Différentes plates-formes stockent des données dans différents ordres.

Disons que vous avez un short -circuit de 0x9FD3. Sur une plate-forme Small Endian, il sera stocké en mémoire sous la forme 0xD39F. Le premier octet est 0xD3 et le prochain octet sera 0x9F. Si vous envoyez cela à une machine qui utilise Big Endian par défaut, il sera interprété comme 0xD39F (54,1475), par opposition à 0x9FD3 (40,915). Les chaînes, en revanche, sont conservées sous forme de tableaux de caractères, ce qui est tout à fait normal. Si vous aviez “aSsortingng”, il serait enregistré comme “a”, “S”, “t”, “r” … en mémoire parce que 1 caractère est large de 1 octet. Seuls les types de données de plusieurs octets seront stockés dans l’ordre inverse sur les petites plates-formes Endian, rendant la conversion inutile.

Différents ordinateurs ont une endianité différente. L’endianisme s’applique principalement aux variables qui prennent plus d’un octet (c’est pourquoi vous l’utilisez généralement – pas toujours – avec des entiers et non des caractères, car typiquement, un caractère prend un octet). Lisez le mode sur l’endianité et cela devrait être plus clair pour vous. Comme je l’ai dit, il n’est pas nécessaire d’utiliser htonl lors de l’envoi de nombres entiers, mais c’est généralement fait, pour se mettre d’accord sur une représentation “commune”, car vous pourriez ne pas savoir toujours quelle machine endianness cible aura. De cette manière, le client et le serveur s’accordent pour dire que le numéro est codé dans une finalité particulière – afin de pouvoir modifier l’ordre des octets en cas de besoin.