Maintenant que vous savez communiquer entre machines, vous devez encore faire attention à une chose, très importante. De même qu'au téléphone, votre correspondant peut parler une autre langue que le français, l'ordinateur avec lequel vous vous êtes connecté peut être très différent du votre. Différentes machines peuvent utiliser différents dialectes, par exemple l'une le code ASCII, l'autre EBCDIC. Mais ce cas est rare, le problème de l'ordre des octets est bien plus courant. À moins que vous ne passiez toujours que du texte ASCII, vous serez souvent confronté à l'ordre des octets dans les formats binaires, entre les différentes architectures (Intel contre Motorola, PC contre Sun par exemple). Heureusement pour vous, ce cas est prévu. Nous allons voir ça.
Il y a bien longtemps, lors de la préhistoire du réseau, quelqu'un a décidé quel était l'ordre ``correct''. On l'appela l'ordre réseau (Network byte order) et tout fut pour le mieux. Mais certains constructeurs ayant par la suite réalisé des machines utilisant tout autre chose, il fut alors implémenté toute une série de fonctions, destinées sur chaque ordinateur à assurer la compatibilité avec l'ordre réseau. Même si vous êtes dans les petits secrets de votre machine, et si vous savez qu'elle utilise en interne l'ordre réseau, vous devez toujours utiliser ces fonctions dans vos programmes, afin de les rendre parfaitement portables. Voici une liste des plus utilisées, vous trouverez les autres dans vos pages de manuel système.
htons()
Host to Network Short integer,
convertit un entier court du format interne au
format réseau.
ntohs()
Network to Host Short integer,
convertit un entier court du format réseau au
format interne.
htonl()
Host to Network Long integer,
convertit un entier long du format interne au
format réseau.
ntohl()
Network to Host Lont integer,
convertit un entier long du format réseau au
format interne.Avant d'envoyer un entier dans une socket, vous devez le passer au format réseau, par exemple :
i = htonl(i);
write_data(s, &i, sizeof(i));
Et après l'avoir lu, vous vous devez le passer au format interne :
read_data(s, &i, sizeof(i));
i = ntohl(i);
Si vous prenez l'habitude d'utiliser ces fonctions, vous vous éviterez bien des ennuis et de longues recherches de bogues, n'apparaissant que sur certaines architectures.