int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Die tatsächliche Struktur, die für das Argument addr übergeben wird, hängt von der Adressfamilie ab. Die sockaddr Struktur ist definiert als so etwas wie:Was ist der Zweck des Feldes sa_data in einem Sockaddr?
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
Also für eine IPv4-Adresse (AF_INET), die tatsächliche Struktur, die weitergegeben wird, ist dies:
/* 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 */
};
Hat der bind Code lesen Sie den sockaddr.sa_family
Wert und abhängig von dem Wert, den es findet, wird es dann die Struktur in die entsprechende Struktur wie sockaddr_in
?
Warum ist die sa_data
auf 14 Zeichen gesetzt? Wenn ich das richtig verstehe, ist das Feld sa_data
nur ein Feld, das genügend Speicherplatz für alle Adressfamilien bietet. Vermutlich erwarteten die ursprünglichen Designer, dass 14 Zeichen breit genug wären, um allen zukünftigen Typen zu entsprechen.
https://en.wikipedia.org/wiki/Type_punning – user3386109