Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算sockaddr_un结构大小的哪种方法是正确的?_C_Sockets_Unix - Fatal编程技术网

计算sockaddr_un结构大小的哪种方法是正确的?

计算sockaddr_un结构大小的哪种方法是正确的?,c,sockets,unix,C,Sockets,Unix,unix域套接字地址结构定义为: struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[108]; /* pathname */ }; 我看到了两种计算大小的方法,稍后会传递给bind 来自APUE和 Linux编程接口 哪条路正确?(可能两者都是正确的?正确的方法是实际使用sizeof(struct sockaddr\u un)。正确的方法是实际使用sizeof(struct sock

unix域套接字地址结构定义为:

struct sockaddr_un {
    sa_family_t sun_family; /* AF_UNIX */
    char sun_path[108]; /* pathname */
};
我看到了两种计算大小的方法,稍后会传递给
bind

  • 来自APUE和
  • Linux编程接口

  • 哪条路正确?(可能两者都是正确的?

    正确的方法是实际使用
    sizeof(struct sockaddr\u un)

    正确的方法是实际使用
    sizeof(struct sockaddr\u un)

    请参阅了解Beej指南变体不正确的原因。APUE的变体和在整个结构上使用
    sizeof
    都是有效的。@有些程序员先把不正确的形式放在一边。如果APUE的变体和
    sizeof
    在整个结构上都起作用,为什么还要费心编写APUE的变体呢<代码>大小=偏移量(结构sockaddr\u un,sun\u路径)+strlen(un.sun\u路径)看起来很可怕。Pue现在已经很老了(最初发表于1992年),这在当时可能是一个很好的解决方案。@Someprogrammerdude好吧,那么让我猜猜:是不是过去的
    bind
    函数需要每个地址成员大小的特定大小,虽然较新的
    bind
    可以接受整个
    sizeof
    的填充?@Someprogrammerdude我检查了
    函数用法的偏移量,我上面的猜测是错误的。APUE变体和整个结构的
    sizeof
    都向
    bind
    传递了足够的字节(都包括填充字节),而Beej的变体可能没有为
    sockaddr\u un.sun\u系列传递足够的字节。我看不出APUE变量和整个结构的大小之间有多大区别:)看看Beej的指南变量为什么不正确。APUE的变体和在整个结构上使用
    sizeof
    都是有效的。@有些程序员先把不正确的形式放在一边。如果APUE的变体和
    sizeof
    在整个结构上都起作用,为什么还要费心编写APUE的变体呢<代码>大小=偏移量(结构sockaddr\u un,sun\u路径)+strlen(un.sun\u路径)
    看起来很可怕。Pue现在已经很老了(最初发表于1992年),这在当时可能是一个很好的解决方案。@Someprogrammerdude好吧,那么让我猜猜:是不是过去的
    bind
    函数需要每个地址成员大小的特定大小,虽然较新的
    bind
    可以接受整个
    sizeof
    的填充?@Someprogrammerdude我检查了
    函数用法的偏移量,我上面的猜测是错误的。APUE变体和整个结构的
    sizeof
    都向
    bind
    传递了足够的字节(都包括填充字节),而Beej的变体可能没有为
    sockaddr\u un.sun\u系列传递足够的字节。我看不出APUE变体和整个结构的大小有多大区别:)
    
    //beej's guide
    struct sockaddr_un local;
    int len;
    
    len = strlen(local.sun_path) + sizeof(local.sun_family);
    bind(s, (struct sockaddr *)&local, len);
    
    //APUE
    struct sockaddr_un un;
    size = offsetof(struct sockaddr_un, sun_path) + strlen(un.sun_path);
    bind(fd, (struct sockaddr *)&un, size)
    
    const char *SOCKNAME = "/tmp/mysock";
    struct sockaddr_un addr;
    addr.sun_family = AF_UNIX; /* UNIX domain address */
    strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);
    bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un))