Partilhar via


Ordenação de bytes

Deve-se sempre ter em conta quaisquer diferenças entre a ordem de bytes usada para armazenar inteiros pela arquitetura do host e a ordem de bytes usada no fio por protocolos de transporte individuais. Qualquer referência a um endereço ou número de porta passado de ou para uma rotina do Windows Sockets deve estar na ordem de rede (big-endian) para o protocolo que está sendo utilizado. No caso do IP, isso inclui os parâmetros de endereço IP e porta de uma estrutura sockaddr (mas não o parâmetro sin_family).

Vários sistemas UNIX operam em CPUs que representam inteiros em ordem de bytes de rede (big-endian). Portanto, a necessidade de converter inteiros da ordem de bytes do host para a ordem de bytes da rede pode ser ignorada sem causar problemas, mesmo que isso não seja recomendado para portabilidade.

Em contraste, a ordem de bytes usada para representar inteiros pela maioria das CPUs Intel® é conhecida como 'little-endian'. Assim, torna-se obrigatório que os inteiros sejam convertidos da ordem de bytes do host para a ordem de bytes da rede antes de serem usados em funções e estruturas do Winsock Sockets.

Considere um aplicativo que normalmente contata um servidor na porta TCP correspondente ao serviço de tempo, mas fornece um mecanismo para o usuário especificar uma porta alternativa. O número da porta retornado por getservbyname já está em ordem de rede, que é o formato necessário para construir um endereço, de modo que não é necessária tradução. No entanto, se o utilizador optar por usar uma porta diferente, inserida como um inteiro, a aplicação deve convertê-la da ordem do host para a ordem de rede do TCP/IP (usando a função htons ou WSAHtons) antes de a utilizar para construir o endereço. Por outro lado, se o aplicativo exibir o número da porta dentro de um endereço (retornado por getpeername por exemplo), o número da porta deve ser convertido da rede para a ordem do host (usando a ntohs ou função WSANtohs) antes que possa ser exibida.

Como as ordens de bytes da Intel e da Internet são diferentes, as conversões descritas no precedente são inevitáveis. Os criadores de aplicativos são advertidos de que devem usar as funções de conversão padrão fornecidas como parte do Winsock em vez de escrever seu próprio código de conversão, uma vez que implementações futuras do Winsock provavelmente serão executadas em sistemas para os quais a ordem do host é idêntica à ordem de bytes da rede. Apenas os aplicativos que usam as funções de conversão padrão entre a ordem de bytes do host e da rede provavelmente serão portáteis.

getpeername

GetServByName

htonl

htons

ntohl

ntohs

Portando aplicativos de soquete para Winsock

sockaddr

Considerações sobre programação Winsock

WSAHtonl

WSAHtons

WSANtohl

WSANtohs