Mon doute est lié à la structure suivante des sockets sous UNIX:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
Ici le membre sin_addr
est de type struct in_addr
.
Mais je ne comprends pas pourquoi quelqu'un voudrait faire ça comme tout struct inaddr
has est:
struct in_addr {
unsigned long s_addr; // load with inet_pton()
};
Tout in_addr
a un seul membre s_addr
. Pourquoi ne pouvons-nous pas avoir quelque chose comme ça:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
unsigned long s_addr ;
char sin_zero[8]; // zero this if you want to
};
struct in_addr
est parfois très différent de cela, selon le système sur lequel vous vous trouvez. Sur Windows par exemple:
typedef struct in_addr {
union {
struct {
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct {
u_short s_w1,s_w2;
} S_un_w;
u_long S_addr;
} S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
La seule exigence est qu'elle contienne un membre s_addr
.
Parce que le in_addr
la structure peut contenir plusieurs membres.
http://pubs.opengroup.org/onlinepubs/009604599/basedefs/netinet/in.h.html
struct in_addr
est plus qu'un simple entier car il peut avoir plus de in_addr_t
. Dans de nombreux systèmes, il a un union
, et la raison d'une telle implémentation est pour adresses de classe A/B/C , qui ne sont pas utilisées actuellement.
Unix Network Programming Volume 1 explique la raison historique en détail:
La raison pour laquelle le
sin_addr
membre est une structure, et pas seulement unin_addr_t
, est historique. Les versions antérieures (4.2BSD) définissaient lein_addr
structure en tant queunion
de diverses structures, pour permettre l'accès à chacun des 4 octets et aux deux valeurs 16 bits contenues dans l'adresse IPv4 32 bits. Cela a été utilisé avec les adresses de classe A, B et C pour récupérer les octets appropriés de l'adresse. Mais avec l'avènement du sous-réseau puis la disparition des différentes classes d'adresses avec l'adressage sans classe, le besoin d'union a disparu. Aujourd'hui, la plupart des systèmes ont supprimé leunion
et se contentent de définirin_addr
en tant que structure avec un seulin_addr_t
membre.