使用offsetof()而不是sizeof()与套接字有什么区别吗?

时间:2015-11-05 00:31:44

标签: c linux sockets

在套接字编程中,特别是在处理类型为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这样的函数真的有什么不同吗?如果没有,这两个可以互换使用吗?

2 个答案:

答案 0 :(得分:2)

offsetof 会考虑C编译器在基本成员大小之后添加的任何填充。但是,如果使用包含C编译器添加的填充的C结构定义网络数据包,则会出现更大的问题!事实上,我确保添加了一个测试用例,以确保两个方法返回相同的大小,以防止错误的编译选项更改填充规则,例如。

在这个问题的背景下,不,它对绑定没有任何影响。

答案 1 :(得分:0)

我会说您发布的offsetof版本不正确。它应该至少有+1,因为路径被定义为以空字符结尾的字符串,这是内核返回的长度,例如来自getsockname()

即使有+1,我也没有看到使用复杂的东西而不是简单的东西。它确实将一些字节传输到内核,但bind()和朋友几乎不是速率决定步骤。