Compartir a través de


ordenación de bytes

Siempre se debe tener cuidado para tener en cuenta las diferencias entre el orden de bytes utilizado para almacenar enteros por la arquitectura del host y el orden de bytes utilizado en el cable por protocolos de transporte individuales. Cualquier referencia a una dirección o número de puerto pasado a o desde una rutina de Windows Sockets debe estar en el orden de red (big-endian) para el protocolo que se está utilizando. En el caso de ip, esto incluye la dirección IP y los parámetros de puerto de una estructura sockaddr (pero no el parámetro sin_family ).

Varios sistemas UNIX operan en CPU que representan enteros en orden de bytes de red (big-endian). Por lo tanto, la necesidad de convertir enteros del orden de bytes del host al orden de bytes de red se puede omitir sin causar problemas incluso si esto no se recomienda para la portabilidad.

Por el contrario, el orden de bytes usado para representar enteros por la mayoría® de las CPU intel es little-endian. Por lo tanto, es obligatorio que los enteros se conviertan del orden de bytes del host al orden de bytes de red antes de usarse en las funciones y estructuras de sockets de Winsock.

Considere una aplicación que normalmente se pone en contacto con un servidor en el puerto TCP correspondiente al servicio de hora, pero proporciona un mecanismo para que el usuario especifique un puerto alternativo. El número de puerto devuelto por getservbyname ya está en orden de red, que es el formato necesario para construir una dirección para que no se requiera traducción. Sin embargo, si el usuario decide usar un puerto diferente, escrito como un entero, la aplicación debe convertirla del host al orden de red TCP/IP (mediante la función htons o WSAHtons ) antes de usarlo para construir una dirección. Por el contrario, si la aplicación mostrara el número del puerto dentro de una dirección (devuelto por getpeername por ejemplo), el número de puerto debe convertirse de la red al orden de host (mediante la función ntohs o WSANtohs ) antes de que se pueda mostrar.

Dado que los pedidos de bytes de Intel e Internet son diferentes, las conversiones descritas en el anterior son inevitables. Se advierte a los escritores de aplicaciones que deben usar las funciones de conversión estándar proporcionadas como parte de Winsock en lugar de escribir su propio código de conversión, ya que es probable que las implementaciones futuras de Winsock se ejecuten en sistemas para los que el orden de host sea idéntico al orden de bytes de red. Solo es probable que las aplicaciones que usen las funciones de conversión estándar entre el orden de bytes de host y de red sean portátiles.

getpeername

getservbyname

htonl

htons

ntohl

ntohs

Migración de aplicaciones de socket a Winsock

sockaddr

Consideraciones de programación de Winsock

WSAHtonl

WSAHtons

WSANtohl

WSANtohs