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
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
.
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).
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.
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. –
Tiene razón; tenía la intención de decir algo así, pero no estaba muy claro en mi respuesta. –
- 1. Little endian Vs Big endian
- 2. Little/Big Endian
- 3. C# little endian o big endian?
- 4. Big-endian vs. little-endian machines
- 5. Entero con signo Little-Endian
- 6. Big endian o Little endian en la red?
- 7. (java) Escribiendo en el archivo little endian
- 8. Little endian data y sha 256
- 9. descodificación, little endian, descomprimido y matriz flotante
- 10. ¿Por qué es x86 little endian?
- 11. Forma rápida de intercambiar bytes en un array de big endian a little endian en C#
- 12. Convertir cadena hexadecimal "little endian" a dirección IP en Python
- 13. ¿Hay alguna forma de compilar y ejecutar un programa como big-endian en little endian pc?
- 14. ¿Cómo convierto un valor de orden de bytes de host a little endian?
- 15. ¿Cómo convertir una matriz de bytes int a little endian?
- 16. IsLittleEndian reportes de campo falso, pero debe ser Little-Endian?
- 17. Conversión de los valores de flotación de big endian a little endian
- 18. Convertir big endian a little endian al leer de un archivo binario
- 19. Servidor SQL binario (128) convertir de little endian a big endian
- 20. Averiguar si el sistema es little endian o big endian con perl
- 21. ¿Cómo comprobar si un sistema es big endian o little endian?
- 22. ¿Qué transformaciones utilizan los sistemas little-endian para convertir datos en orden de red?
- 23. htons & ntohl en datatransfer
- 24. Conversión de 8 bytes de binario little-endian en un flotador de precisión doble
- 25. BinaryWriter Endian problema
- 26. Node.JS Big-Endian UCS-2
- 27. Sustituyendo Groovy por Java Little By Little
- 28. C# - Lector binario en Big Endian?
- 29. ¿Práctica recomendada para convertir valores de complemento de 24 bits, little endian, two en ints en C#?
- 30. ¿Se requiere conversión endian para datos wchar_t?
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
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. –
¿Qué pasa con los tipos de datos no integrales como las estructuras? ¿Tienen endianes? –