int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Faktyczna struktura przekazana dla argumentu addr będzie zależeć od rodziny adresów. Struktura sockaddr jest definiowana jako coś w rodzaju:Jaki jest cel pola sa_data w sockaddr?
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
więc dla adresu IPv4 (AF_INET), rzeczywista struktura, która będzie przekazywana jest taka:
/* 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 */
};
Czy kod wiążą odczytać wartość sockaddr.sa_family
i w zależności od wartości, którą znajdzie, następnie odrzuci strukturę sockaddr
do odpowiedniej struktury, takiej jak sockaddr_in
?
Dlaczego sa_data
ma 14 znaków? Jeśli rozumiem poprawnie, pole sa_data
jest tylko polem, które będzie wystarczająco duże, aby pasowało do wszystkich typów rodzin adresów? Prawdopodobnie pierwotni projektanci przewidzieli, że 14 znaków będzie wystarczająco szerokie, aby pasowały do wszystkich przyszłych typów.
https://en.wikipedia.org/wiki/Type_punning – user3386109