int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
La struttura effettiva passata per l'argomento addr dipenderà dalla famiglia di indirizzi. La struttura sockaddr è definito come qualcosa di simile a:Qual è lo scopo del campo sa_data in un sockaddr?
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
Così, per un indirizzo IPv4 (AF_INET), la struct effettivo che verrà passato è questo:
/* Source http://linux.die.net/man/7/ip */
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
funziona il codice di bind leggere il valore sockaddr.sa_family
e in base al valore rilevato, verrà quindi lanciata la struttura sockaddr
nella struttura appropriata, ad esempio sockaddr_in
?
Perché lo sa_data
è impostato su 14 caratteri? Se ho capito bene, il campo sa_data
è solo un campo che avrà uno spazio di memoria sufficiente per adattarsi a tutti i tipi di famiglie di indirizzi? Presumibilmente i designer originali hanno previsto che 14 personaggi sarebbero stati abbastanza ampi da adattarsi a tutti i tipi futuri.
https://en.wikipedia.org/wiki/Type_punning – user3386109