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? P>
3 Réponses :
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 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.) P>
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 code> ou
ou
htonl code> et l'ordinateur de réception doit le convertir en ordre d'octet hôte en utilisant
NTOHS code> ou
NTOHL code>. p>.
htons code>. P>.
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 i> hton * code> et
NTOH * code> et, en fait, ces fonctions ne sont pas garanties pour effectuer la sérialisation.
Si vous souhaitez envoyer des données d'une machine X86 ou AMD64 à une machine avec un processeur PowerPC, dans 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.) P>
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. P>
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.