Question

Lorsque j'envoie une variable entière d'un processus à l'autre par prise, et l'impression de la valeur à la fin de reçu, la valeur reste la même sans utiliser ntohl / htonl, alors où dois-je utiliser ces fonctions autres que l'initialisation les structures de support. Je comprends litte / big endian. Mais pourquoi avons-nous besoin de convertir le port et nos IP pour héberger / ordre des octets du réseau lorsque la valeur reste la même. S'il vous plaît expliquer en détail comment l'entier est tranferred sur le réseau?

Était-ce utile?

La solution

Si vous voulez que votre programme soit portable, puis chaque fois que vous envoyez un entier supérieur à 1 octet taille sur le réseau, vous devez d'abord le convertir en ordre du réseau d'octets en utilisant htons ou htonl, et l'ordinateur récepteur doit convertir pour accueillir l'ordre des octets en utilisant ntohs ou ntohl.

Dans votre cas, la raison pour laquelle la valeur est toujours le même est probablement parce que l'ordinateur émetteur et l'ordinateur de réception sont de la même boutisme. En d'autres termes, l'envoi ordinateur et l'ordinateur de réception vous travaillez avec les deux sont peu endian (ou big endian, quel que soit le cas.)

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

Autres conseils

Si vous souhaitez envoyer des données à partir d'une machine x86 ou AMD64 à une machine avec un processeur PowerPC, binaire le format, vous verrez rapidement que vos données rencontre le « problème NUXI » comme différent processeurs traitent différemment les entiers et semblent échanger les octets. (Ils ne abandonnent pas réellement les octets -. Ils fonctionnent avec eux dans un ordre différent)

Lorsque vous travaillez sur x86 ou AMD64, l'octet le moins significatif vient d'abord en mémoire (cette façon, vous pouvez effectuer une addition de moins à des adresses de mémoire plus élevées). Le PowerPC met l'octet le plus significatif d'abord en mémoire (cette façon, vous pouvez trier les numéros en fonction des octets qui viennent plus tôt dans la mémoire -. Une sorte de chaîne et un tri entier peut être exactement le même)

Il remaimns même que sur votre architecture de l'ordre de réseau est le même que l'ordre natif. Si vous ne prévoyez la compilation de votre code pour une autre architecture, vous pouvez omettre les appels Hton / AH. Votre code ne serait alors pas portable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top