9
votes

Confusion dans HTS - Petit Endian / Big Endian

Lorsque j'envoie une variable entière d'un processus à une autre prise via via, puis imprimez la valeur à l'extrémité reçue, la valeur est toujours la même sans utiliser NTOHL / HTONL, alors où dois-je utiliser ces fonctions autres que l'initialisation de l'initialisation Structures de socket. Je comprends Litte / Big Endian. Mais pourquoi devons-nous convertir le port et les IP NOS en ordre d'host / réseau d'octet lorsque la valeur reste la même. Veuillez expliquer en détail comment l'entier est transféré sur le réseau?


0 commentaires

3 Réponses :


16
votes

Si vous souhaitez que votre programme soit portable, alors à tout moment, vous envoyez un entier supérieur à 1 octet de taille via le réseau, vous devez d'abord la convertir à la commande d'octet de réseau en utilisant htons ou ou htonl et l'ordinateur de réception doit le convertir en ordre d'octet hôte en utilisant NTOHS ou NTOHL . .

Dans votre cas, la valeur La valeur est toujours identique est probablement parce que l'ordinateur d'envoi et l'ordinateur de réception sont de la même endansion. En d'autres termes, l'ordinateur d'envoi et l'ordinateur de réception que vous travaillez sont à la fois petit Endian (ou Big Endian, quel que soit le cas.)

Mais si vous voulez que votre programme soit portable, vous ne pouvez pas compter sur ceci pour toujours être le cas. Un jour, par exemple, l'ordinateur d'envoi peut être un Intel X86 et la réception peut être un Sun SPARC, puis votre programme échouera si vous n'utilisez pas htons . .


5 commentaires

J'ai écrit client et serveur et n'a pas utilisé Htonl et NTOHL. Dites quand j'ai envoyé 6, serveur a reçu 6 valeur. Alors quel est le besoin de ces fonctions?


La nécessité de ces fonctions est dans le cas où le client s'exécute sur un ordinateur Little-Endian et le serveur s'exécute sur un Big-Endian ou vice versa.


Qu'en est-il des types de données non intégrés tels que des structures? Ont-ils une endianness?


Les membres de la structure de @andrewmckinlay sont commandés dans l'ordre de leur définition. Cependant, il existe d'autres préoccupations telles que le rembourrage: Stackoverflow.com/a/2749096/4131237


Je suis en désaccord avec tout le premier paragraphe. La sérialisation et la désérialisation sont possibles sans hton * et NTOH * et, en fait, ces fonctions ne sont pas garanties pour effectuer la sérialisation.



9
votes

Si vous souhaitez envoyer des données d'une machine X86 ou AMD64 à une machine avec un processeur PowerPC, dans Binary Binary Format, vous verrez rapidement que vos données rencontrent le "problème Nuxi" comme différent Les processeurs traitent les entiers différemment et semblent échanger les octets. (Ils ne échangent pas réellement des octets - ils travaillent juste avec eux dans un ordre différent.)

Lorsque vous travaillez sur X86 ou AMD64, l'octet le moins important est d'abord en mémoire (de cette façon, vous pouvez effectuer une addition d'adresses de mémoire inférieure à la plus haute). Le PowerPC place d'abord l'octet le plus significatif en mémoire (de cette façon, vous pouvez trier des numéros basés sur les octets qui arrivent plus tôt en mémoire - une sorte de chaîne et un tri entier peut être exactement identique.)


0 commentaires

0
votes

Il remonte la même chose parce que sur votre architecture, la commande réseau est identique à celle de l'ordre natal. Si vous ne prévoyez jamais de compiler votre code pour une autre architecture, vous pouvez omettre les appels HTON / NTOH. Votre code ne serait alors pas portable.


2 commentaires

Ce n'est pas correct. Il pourrait bien utiliser une architecture où l'ordre d'hôte est différent de la commande réseau. Votre code «Travaillera» sans Htonx / NTOHX chaque fois que l'architecture des deux critères d'extrémité a la même endanianesse.


Vous êtes correct - j'avais l'intention de dire quelque chose comme ça, mais n'était pas très clair dans ma réponse.