Classement des octets
Il faut toujours prendre soin de tenir compte de toutes les différences entre l’ordre des octets utilisé pour stocker les entiers par l’architecture de l’hôte et l’ordre des octets utilisé sur le réseau par des protocoles de transport individuels. Toute référence à une adresse ou un numéro de port passé vers ou à partir d’une routine Windows Sockets doit être dans l’ordre réseau (big-endian) pour le protocole utilisé. Dans le cas de l’adresse IP, cela inclut les paramètres d’adresse IP et de port d’une structure sockaddr (mais pas le paramètre sin_family ).
Un certain nombre de systèmes UNIX fonctionnent sur des processeurs qui représentent des entiers dans l’ordre d’octet du réseau (big-endian). Ainsi, la nécessité de convertir des entiers de l’ordre d’octet de l’hôte en ordre d’octets réseau peut être ignorée sans provoquer de problèmes, même si cela n’est pas recommandé pour la portabilité.
En revanche, l’ordre d’octets utilisé pour représenter les entiers par la plupart des processeurs Intel® est little-endian. Il devient donc obligatoire que les entiers soient convertis de l’ordre d’octet hôte en ordre d’octets réseau avant d’être utilisés dans les fonctions et structures winsock Sockets.
Prenons l’exemple d’une application qui contacte normalement un serveur sur le port TCP correspondant au service de temps, mais qui fournit un mécanisme permettant à l’utilisateur de spécifier un autre port. Le numéro de port retourné par getservbyname est déjà dans l’ordre réseau, qui est le format requis pour construire une adresse afin qu’aucune traduction ne soit requise. Toutefois, si l’utilisateur choisit d’utiliser un port différent, entré en tant qu’entier, l’application doit convertir ce port de l’hôte en ordre réseau TCP/IP (à l’aide de la fonction htons ou WSAHtons ) avant de l’utiliser pour construire une adresse. À l’inverse, si l’application devait afficher le numéro du port dans une adresse (retourné par getpeername par exemple), le numéro de port doit être converti du réseau dans l’ordre hôte (à l’aide de la fonction ntohs ou WSANtohs ) avant de pouvoir être affiché.
Étant donné que les ordres d’octets Intel et Internet sont différents, les conversions décrites dans le précédent sont inévitables. Les rédacteurs d’applications sont avertis qu’ils doivent utiliser les fonctions de conversion standard fournies dans le cadre de Winsock plutôt que d’écrire leur propre code de conversion, car les futures implémentations de Winsock sont susceptibles de s’exécuter sur des systèmes pour lesquels l’ordre de l’hôte est identique à l’ordre d’octets réseau. Seules les applications qui utilisent les fonctions de conversion standard entre l’ordre d’octets de l’hôte et du réseau sont susceptibles d’être portables.
Rubriques connexes