A struct sockaddr
sollte in der Regel nur als Basistyp für einen Zeiger verwendet werden. Es ist eine Struktur soll die gemeinsame Anfangssequenz der Mitglieder in der Adressfamilie spezifischen Socket-Adresstypen abzudecken (struct sockaddr_un
, struct sockaddr_in
, struct sockaddr_in6
etc.)
Das einzige Mitglied, das Sie auf struct sockaddr
verlassen können, die ein einzelnes sa_family_t
, Angabe der Socket-Adressfamilie. Die Idee ist, dass eine Art von Polymorphismus zu erhalten - eine Funktion haben kann, die auf verschiedenen Socket-Adresstypen arbeiten können:
void foo(struct sockaddr *sa)
{
switch(sa->sa_family)
{
case AF_INET: {
struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;
/* AF_INET processing */
}
case AF_UNIX: {
struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;
/* AF_UNIX processing */
}
/* ... */
Beachten Sie aber, dass Code wie die oben im Allgemeinen das „strenge Aliasing“ betrachtet zu brechen Regel in C - wenn Sie, dass in Ihrem eigenen Code tun mögen, sollen Sie eine Vereinigung Typen verwenden:
union sockaddr {
struct sockaddr sa;
struct sockaddr_in sin;
struct sockaddr_un sun;
/* ... */
};
void foo(union sockaddr *sa_union)
{
struct sockaddr *sa = (struct sockaddr *)sa_union;
switch(sa->sa_family)
{
case AF_INET: {
struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;
/* AF_INET processing */
}
case AF_UNIX: {
struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;
/* AF_UNIX processing */
}
/* ... */
bereitgestellt Link ist klare Sicht für diff in Unix und Internet-Buchsen –