struct sockaddr_un与sockaddr

Pav*_*tar 30 c sockets linux struct client-server

有什么struct sockaddr不同struct sockaddr_un

我知道我们在客户端 - 服务器模块中使用这些结构,用于将套接字绑定到套接字地址.我们使用一个强制转换操作符来接受struct sockaddr_un.

我想知道它们有多么不同/类似,以及为什么演员?

pau*_*sm4 31

"struct sockaddr"是一个通用定义.任何需要地址的套接字函数都会使用它.

"struct sockaddr_un"("Unix套接字"地址)是一种特定的地址族.

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

强制转换允许套接字API接受通用参数类型,该类型实际上是几种不同实际类型中的任何一种.

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

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


caf*_*caf 23

A struct sockaddr通常只应用作指针的基类型.它是旨在覆盖在地址族特定套接字地址类型成员的公共初始序列的结构(struct sockaddr_un,struct sockaddr_in,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 */
    }

/* ... */
Run Code Online (Sandbox Code Playgroud)

注意,虽然像上面这样的代码通常被认为是打破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 */
    }

/* ... */
Run Code Online (Sandbox Code Playgroud)