2010-09-11 20 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