2010-09-11 8 views
24

Wie ist struct sockaddr anders als struct sockaddr_un?struct sockaddr_un v/s sockaddr - C (Linux)

Ich weiß, dass wir diese Strukturen in Client-Server-Module, zum Binden der Buchse an die Steckdose verwenden address.And verwenden wir einen Cast-Operator für das struct sockaddr_un zu akzeptieren.

Ich möchte wissen, wie unterschiedlich/ähnlich sind sie, und warum der Cast-Operator?

Antwort

23

"struct sockaddr" ist eine allgemeine Definition. Es wird von jeder Socket-Funktion verwendet, die eine Adresse benötigt.

"struct sockaddr_un" (eine "Unix-Sockets" Adresse) ist eine bestimmte Art von Adressfamilie.

die häufiger gesehen „struct sockaddr_in“ (eine „Internet-Socket“ Adresse) ist ein andere spezifische Art von Adressfamilie.

Die Besetzung ist, was die Sockets-APIs ermöglicht einen gemeinsamen Parametertyp zu akzeptieren, die eigentlich jeder eine von mehreren verschiedenen tatsächlichen Typen sein.

Hier ist eine gute Verbindung, die mehrere verschiedene Adressfamilie Definitionen zeigt:

http://www.cas.mcmaster.ca/~qiao/courses/cs3mh3/tutorials/socket.html

+0

bereitgestellt Link ist klare Sicht für diff in Unix und Internet-Buchsen –

19

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 */ 
    } 

/* ... */ 
+1

@ caf gibt - Vielen Dank – Pavitar