int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
実際にaddr引数に渡される構造体は、アドレスファミリによって異なります。sockaddrのsa_dataフィールドの目的は何ですか?
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
だから、IPv4アドレス(AF_INET)のために、渡されます、実際の構造体はこれです::のようなもののようにsockaddr構造体が定義されている
/* 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 */
};
バインドコードはsockaddr.sa_family
値を読んでいます見つかった値に応じて、sockaddr_in
などの適切な構造体にsockaddr
構造体をキャストしますか?
sa_data
が14文字に設定されているのはなぜですか?私が正しいと理解すれば、sa_data
フィールドは、すべてのアドレスファミリタイプに適合する十分なメモリスペースを持つフィールドにすぎませんか?おそらく元の設計者は、14文字がすべての将来のタイプに適合するのに十分な幅であると予想していたと思われます。 glibc manualによれば
https://ja.wikipedia.org/wiki/Type_punning – user3386109