2010-09-11 56 views
24

struct sockaddr如何與不同?struct sockaddr_unstruct sockaddr_un v/s sockaddr - C(Linux)

我知道我們在客戶端服務器模塊中使用這些結構來將套接字綁定到套接字地址。並且我們使用一個cast操作符來接受struct sockaddr_un。

我想知道他們有多不同/相似,以及爲什麼演員操作?

回答

23

「struct sockaddr」是一個通用的定義。它被任何需要地址的套接字函數使用。

「struct sockaddr_un」(一個「Unix套接字」地址)是一種特定類型的地址族。

更常見的「struct sockaddr_in」(「Internet套接字」地址)是另一種特定的地址族。

該轉換允許套接字API接受一個通用參數類型,該類型實際上是幾種不同的實際類型中的任何一種。

這裏有一個很好的鏈接,顯示幾個不同的地址族定義:

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

+0

提供的鏈接是給出了在UNIX和互聯網插座 – 2015-05-26 11:52:54

19

一個struct sockaddr通常只應作爲基本類型的指針。它是旨在覆蓋在地址族特定套接字地址類型成員(struct sockaddr_unstruct sockaddr_instruct sockaddr_in6等)

的唯一部件的共同的初始序列,可以依靠struct sockaddr具有是單sa_family_t的結構,指示套接字地址系列。我們的想法是,要獲得這種多態性的 - 你可以有,可以在幾個不同的套接字地址類型的操作功能:

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

/* ... */ 

注意,雖然像上面的代碼通常被認爲是打破「嚴格別名」用C規則 - 如果你想要做的是,在自己的代碼,你應該使用的聯合類型:

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

@咖啡館的差異一目瞭然 - 謝謝你 – Pavitar 2010-09-19 16:46:33