struct sockaddr_un v / s sockaddr – C(Linux)

struct sockaddrstruct sockaddr_un有什么不同?

我知道我们在客户端 – 服务器模块中使用这些结构来将套接字绑定到套接字地址。我们使用一个cast操作符来接受struct sockaddr_un。

我想知道他们有多么不同/相似,为什么演员呢?

“struct sockaddr”是一个通用的定义。 它被任何需要地址的套接字函数使用。

“struct sockaddr_un”(一个“Unix套接字”地址)是一种特定类型的地址族。

更常见的“struct sockaddr_in”(“Internet套接字”地址)是另一种特定类型的地址族。

转换是允许套接字API接受一个通常的参数类型,它实际上是几种不同的实际类型中的任何一种。

这是一个很好的链接,显示了几个不同的地址族定义:

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

一个struct sockaddr通常只能用作指针的基类型。 它是一种旨在覆盖地址系列特定的套接字地址类型( struct sockaddr_unstruct sockaddr_instruct sockaddr_in6等)中的成员的通用初始序列的struct 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 */ } /* ... */