Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/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
C 解释套接字编程头文件中使用的代码段_C_Sockets - Fatal编程技术网

C 解释套接字编程头文件中使用的代码段

C 解释套接字编程头文件中使用的代码段,c,sockets,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)]; 这里s

谁能给我解释一下这段代码吗

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

这里sinu_zero是一个字符数组,但剩下的部分是什么?它应该是一个整数。这个符号“-”是什么意思?有人能给我解释一下吗?

Sockaddr包含一些类似于in\u addr和in\u port\t的东西,它还有更多的空间。sinu_zero是sockaddr中的剩余大小。它是sockaddr的大小,没有填充其他内容


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

Sockaddr包含一些类似于in\u addr和in\u port\t的内容,它还有更多的空间。sinu_zero是sockaddr中的剩余大小。它是sockaddr的大小,没有填充其他内容


假定sin_zero变量将被初始化为所有空字节,并设置为最后一个字段或位于sockaddr结构的末尾。其目的是将剩余字节设置为空。

sin\u zeor是一个字符数组,其大小使用[]括号中的公式计算 “-”号实际上是一个数学减号:-)


Mario

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


Mario

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

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

好吧,
-
被称为“负号”:-)认真地说,方括号之间的所有内容都是用来计算sin_zero的大小,这就是所谓的填充。它是中的
struct-sockaddr\u中的一个成员,在这里它只是为了确保
中的
struct-sockaddr\u具有特定的大小,很可能是16个字节。这样做的目的是确保大多数(*)
struct sockaddr
变体的大小相同,以避免malloc问题

引述:

POSIX规范只需要结构中的三个成员:sin_家族、sin_addr和sin_端口。POSIX兼容的实现可以定义额外的结构成员,这对于Internet套接字地址结构来说是正常的。几乎所有的实现都添加了sin_zero成员,因此所有套接字地址结构的大小都至少为16字节。


(*)在早期版本中,我写了所有@MaximYegorushkin正确地指出,这不是事实,例如
struct sockaddr\u un
更大。如果希望最大大小适合所有类型的地址,请使用
sizeof(struct sockaddr\u storage)
。这个结构的存在只是为了这个目的(AFAIK)。

好吧,
-
被称为“减号”:-)认真地说,方括号之间的所有内容都是为了计算sinu zero的大小,这就是所谓的填充。它是
中的
struct-sockaddr\u中的一个成员,在这里它只是为了确保
中的
struct-sockaddr\u具有特定的大小,很可能是16个字节。这样做的目的是确保大多数(*)
struct sockaddr
变体的大小相同,以避免malloc问题

引述:

POSIX规范只需要结构中的三个成员:sin_家族、sin_addr和sin_端口。POSIX兼容的实现可以定义额外的结构成员,这对于Internet套接字地址结构来说是正常的。几乎所有的实现都添加了sin_zero成员,因此所有套接字地址结构的大小都至少为16字节。


(*)在早期版本中,我写了所有@MaximYegorushkin正确地指出,这不是事实,例如
struct sockaddr\u un
更大。如果希望最大大小适合所有类型的地址,请使用
sizeof(struct sockaddr\u storage)
。此结构仅用于此目的(AFAIK)。

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


所以,为了回答这个问题,这里的符号“-”只是表示“减法”。

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


所以,为了回答这个问题:这里的符号“-”只是表示“减法”。

我在学习C语言时也遇到了这个问题。 对于其他初学者(像我一样)来说,在你的程序中清除*sin_zero*似乎很重要,这可能是一件有趣的事情(关于这个主题的更多信息可以找到)

在某些系统/体系结构上,它可能会导致问题,而在其他系统/体系结构上,不明确清除*sin_zero*也可以

清除零点的示例:

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

为了防止将来出现一些bug,我认为明确清除它是最好的做法。

我在学习C时也遇到了这个问题。 对于其他初学者(像我一样)来说,在你的程序中清除*sin_zero*似乎很重要,这可能是一件有趣的事情(关于这个主题的更多信息可以找到)

在某些系统/体系结构上,它可能会导致问题,而在其他系统/体系结构上,不明确清除*sin_zero*也可以

清除零点的示例:

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

为了防止将来出现一些bug,我认为明确清除它是最好的做法。

谢谢,伙计。该文档非常有用,其目的是确保所有struct sockaddr变体的大小相同,以避免malloc问题。我不会