计算sockaddr_un结构大小的哪种方法是正确的?
unix域套接字地址结构定义为:计算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
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[108]; /* pathname */
};
我看到了两种计算大小的方法,稍后会传递给bind
哪条路正确?(可能两者都是正确的?正确的方法是实际使用
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))