Share via


ordenação da regra

É necessário sempre ter cuidado para considerar as diferenças entre a ordenação de bytes usada para armazenar inteiros pela arquitetura do host e a ordenação de bytes usada na transmissão 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 de 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 na ordem de bytes de rede (big-endian). Portanto, a necessidade de converter inteiros de ordem de byte de host em ordem de byte de rede pode ser ignorada sem causar problemas, mesmo que isso não seja recomendado para portabilidade.

Por outro lado, a ordenação de bytes usada para representar inteiros pela maioria das® CPUs intel é little-endian. Portanto, torna-se obrigatório que os inteiros sejam convertidos da ordem de bytes do host para a ordem de bytes de 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 hora, mas fornece um mecanismo para o usuário especificar uma porta alternativa. O número da porta retornado por getservbyname já está na ordem de rede, que é o formato necessário para construir um endereço para que nenhuma tradução seja necessária. No entanto, se o usuário optar por usar uma porta diferente, inserida como um inteiro, o aplicativo deverá convertê-la do host para a ordem de rede TCP/IP (usando a função htons ou WSAHtons ) antes de usá-la para construir um 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 deverá ser convertido da rede para a ordem de host (usando o ntohs ou a função WSANtohs ) antes de ser exibido.

Como os pedidos de bytes da Intel e da Internet são diferentes, as conversões descritas no anterior são inevitáveis. Os gravadores 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 futuras implementações do Winsock provavelmente serão executadas em sistemas para os quais a ordem de host é idêntica à ordem de bytes de rede. Somente os aplicativos que usam as funções de conversão padrão entre o host e a ordem de bytes de rede provavelmente serão portáteis.

Getpeername

getservbyname

Htonl

Htons

ntohl

ntohs

Portabilidade de aplicativos de soquete para Winsock

Sockaddr

Considerações sobre programação winsock

WSAHtonl

WSAHtons

WSANtohl

WSANtohs