用于套接字编程的头文件中使用的代码段的说明

时间:2010-09-30 10:50:52

标签: c sockets

有人能解释一下这段代码吗?

/* Pad to size of `struct sockaddr'.  */
unsigned char sin_zero[sizeof (struct sockaddr) -
                       __SOCKADDR_COMMON_SIZE -
                       sizeof (in_port_t) -
                       sizeof (struct in_addr)];

这里sin_zero是一个char数组但剩下的部分是什么?它应该是一些整数。这个标志“ - ”是什么意思?任何人都可以向我解释一下吗?

6 个答案:

答案 0 :(得分:3)

嗯,-被称为“减号”:-)严重的是,方括号之间的所有内容都是为了计算sin_zero的大小,这就是所谓的填充。它是struct sockaddr_in内的成员,它只是为了确保struct sockaddr_in完全是一定的大小,最可能是16个字节。我们的想法是确保大多数(*)struct sockaddr变体具有相同的大小以避免malloc问题。

引用a document I found on the subject

POSIX规范在结构中只需要三个成员:sin_family,sin_addr和sin_port。符合POSIX的实现可以定义其他结构成员,这对于Internet套接字地址结构来说是正常的。几乎所有实现都添加了sin_zero成员,以便所有套接字地址结构的大小至少为16个字节。

(*)在早期版本中,我写了 all 。 @MaximYegorushkin正确地指出这不是真的,例如struct sockaddr_un更大。如果您想要适合所有类型地址的最大大小,请使用sizeof(struct sockaddr_storage)。此结构仅用于此目的(AFAIK)。

答案 1 :(得分:2)

sin_zero是一个结构成员,用于将结构填充到某个最小尺寸。在这种情况下,填充量是通过从所需大小(sizeof (struct sockaddr))开始并从其中减去其他结构成员占用的空间来计算的。

所以,回答这个问题:这里的符号“ - ”只意味着“减法”。

答案 2 :(得分:1)

我也在学习C时遇到这个问题。 对于其他初学者(像我一样),知道它在你的程序中似乎是一种重要的清除* sin_zero *会很有趣(关于这个主题的更多内容可以找到HERE)。

在某些系统/架构上,它可能会导致问题,而在其他系统/架构上则可能没有明确清除* sin_zero *。

清除sin_zero的示例:

struct sockaddr_in serversin;
memset(&serversin, 0, sizeof(serversin));
serversin.sin_family = ...;
serversin.sin_addr = ...;
serversin.sin_port = ...;

为了防止将来出现一些错误,我认为明确清除它是最佳做法。

答案 3 :(得分:0)

Sockaddr包含一些内容,如in_addr和in_port_t,它还有更多空间。 sin_zero是sockaddr中的剩余大小。这是sockaddr的大小,没有其他东西填充。

据说sin_zero变量将初始化为所有空字节,并设置为最后一个字段或sockaddr结构的末尾。这样做的目的是将剩余的字节设置为空。

答案 4 :(得分:0)

sin_zeor是一个char数组,其大小使用[]括号中的公式计算 ' - '符号实际上是一个数学减号: - )

HTH

马里奥

答案 5 :(得分:0)

它根据某些结构的大小和常量计算数组的大小。符号“ - ”表示减号。