_darkalt3_ a écrit :
Merci Sve@r pour cette explication (et du coup)
Citation :
Sauf que le format des données sur le réseau n'est pas standard, et qu'au bout, si la machine n'est pas strictement identique, ça ne fonctionnera pas. (endianness, alignement, taille des types...). Faut pas balancer n'importe quoi sur le réseau...
|
|
La remarque de Emmanuel est importante. En effet, le format d'un int (et autres types assimilés comme short ou long) peut changer entre les systèmes. Dans l'un, il sera codé de gauche à droite, (style 10=0x00a0) et dans l'autre il sera codé de droite à gauche (style 10=0x0a00). Si tu travailles en environnements hétérogènes et que tu balances ta structure comme ça, tu risques d'avoir n'importe quoi dans le champ "age" de l'autre coté.
De plus, certains compilateurs optimisent les structures en rajoutant des octets bidons entre les champs pour aligner la structure sur un mot machine. Si la structure de l'autre coté n'est pas exactement au même format, tu obtiens n'importe quoi.
Pour résumer, si tu veux juste t'amuser à créer un programme pour apprendre les sockets tu peux t'en tenir à mon exemple initial. Mais si tu travailles pour un réel et important projet, alors il te faut
- prendre chaque champ un à un
- si le champ est de type "int" ou assimilé, faut le transformer en "entier réseau" avec "htons()" ou "htonl()" selon le type
- envoyer l'info sur la socket
De l'autre coté, il te faut
- récupérer l'info
- si c'est un "int" ou assimilé faut le convertir en "entier local" avec "ntohs()" ou "ntohl()" selon le type
- stocker l'info dans le champ qui va bien de ta structure
Cours sur les sockets Unix ici: http://fr.lang.free.fr/cours/SocketCsyst_v1.0.pdf
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.