Was ist der Zweck der sa_data Feld in einer sockaddr?

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

Die tatsächliche Struktur übergeben, für die die ADR-argument wird, hängt von der Adresse der Familie. Die sockaddr-Struktur ist definiert als so etwas wie:

struct sockaddr {
    sa_family_t sa_family;
    char        sa_data[14];
}

Also für eine IPv4-Adresse (AF_INET), der eigentlichen struct übergeben 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 */
};

Tut der bind-code Lesen Sie die sockaddr.sa_family Wert und je nach dem Wert, den es findet, es wird dann warf die sockaddr struct in das entsprechende struct wie sockaddr_in?

Warum ist die sa_data set zu 14 Zeichen? Wenn ich verstehe richtig, die sa_data Feld ist einfach ein Feld, das große genug Speicherplatz, um alle passen-Adresse familienformen? Vermutlich sind die original-Designer erwartet, dass 14 Charaktere wäre breit genug, um alle zukünftigen Arten.

InformationsquelleAutor Chris Snow | 2015-09-17
Schreibe einen Kommentar