在套接字编程中,特别是在处理类型为struct sockaddr_un
的Unix域套接字时,有些people use offsetof()
来计算sockaddr_un
结构的大小,如 -
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[108]; /* pathname */
};
size = (offsetof (struct sockaddr_un, sun_path)
+ strlen (name.sun_path));
在某些other places中,他们使用
size = sizeof(struct sockaddr_un)
据我所知,第一种方法考虑了较短的路径名,第二种方法给出了固定的最大尺寸,而与实际的路径长度无关。
对于传递此值的bind
这样的函数真的有什么不同吗?如果没有,这两个可以互换使用吗?
答案 0 :(得分:2)
offsetof 会考虑C编译器在基本成员大小之后添加的任何填充。但是,如果使用包含C编译器添加的填充的C结构定义网络数据包,则会出现更大的问题!事实上,我确保添加了一个测试用例,以确保两个方法返回相同的大小,以防止错误的编译选项更改填充规则,例如。
在这个问题的背景下,不,它对绑定没有任何影响。
答案 1 :(得分:0)
我会说您发布的offsetof
版本不正确。它应该至少有+1,因为路径被定义为以空字符结尾的字符串,这是内核返回的长度,例如来自getsockname()
。
即使有+1,我也没有看到使用复杂的东西而不是简单的东西。它确实将一些字节传输到内核,但bind()
和朋友几乎不是速率决定步骤。