2009-11-05 16 views
9

Cuando envío una variable entera de un proceso a otro mediante socket, y luego imprimo el valor en el extremo recibido, el valor sigue siendo el mismo sin usar ntohl/htonl, entonces dónde Necesito usar estas funciones además de inicializar estructuras de socket. Entiendo a litte/big endian. Pero, ¿por qué tenemos que convertir puertos e IP nos a orden de bytes de host/red cuando el valor sigue siendo el mismo? Por favor, explique en detalle cómo el número entero se transfiere a través de la red.Confusión en htons- little endian/big endian

Respuesta

16

Si desea que su programa sea portátil, cada vez que envíe un número entero de más de 1 byte a través de la red, primero debe convertirlo en orden de bytes de red usando htons o htonl, y la computadora receptora debe convertir para recibir la orden de bytes usando ntohs o ntohl.

En su caso, la razón por la que el valor sigue siendo el mismo es probablemente porque la computadora emisora ​​y la receptora tienen el mismo endianness. En otras palabras, la computadora que envía y la computadora receptora con la que está trabajando son ambos endian (o endian grande, cualquiera que sea el caso)

Pero si desea que su programa sea portátil, no puede confía en esto para que siempre sea el caso. Un día, por ejemplo, la computadora que envía puede ser un Intel x86, y la recepción puede ser un Sun SPARC, y luego su programa fallará si no usa htons.

+0

Escribí el cliente y el servidor y no usé htonl y ntohl. Digamos que cuando envié 6, el servidor recibió 6 valores. Entonces, ¿cuál es la necesidad de estas funciones? – avd

+5

La necesidad de estas funciones es en el caso de que el cliente se ejecute en una computadora little-endian, y el servidor se ejecute en un big-endian, o viceversa. –

+0

¿Qué pasa con los tipos de datos no integrales como las estructuras? ¿Tienen endianes? –

9

Si desea enviar los datos de una máquina x86 o AMD64 a una máquina con un procesador PowerPC, en formato binario que da gusto ver que sus datos se encuentra con el "problema Nuxi" como los diferentes procesadores tratan los números enteros de manera diferente y parecen intercambiar los bytes. (En realidad, no intercambian los bytes, simplemente trabajan con ellos en un orden diferente.)

Al trabajar en x86 o amd64, el byte menos significativo es lo primero en la memoria (de esta forma puede realizar una adición de direcciones de memoria más bajas a más altas). El PowerPC pone el byte más significativo primero en la memoria (de esta manera puede ordenar números basados ​​en los bytes que vienen antes en la memoria).

0

Se remaimns el lo mismo porque en su arquitectura el orden de la red es el mismo que el orden nativo. Si nunca anticipas compilar tu código para otra arquitectura, podrías omitir las llamadas hton/ntoh. Su código no sería portátil.

+1

Esto no es correcto. Él bien podría estar usando una arquitectura donde el orden de host es diferente del orden de la red. Su código 'funcionará' sin htonX/ntohX siempre que la arquitectura de ambos extremos tenga la misma endianess. –

+0

Tiene razón; tenía la intención de decir algo así, pero no estaba muy claro en mi respuesta. –

Cuestiones relacionadas