C++ 正在将“0”调零;sockaddr_in";结构是否必要?

C++ 正在将“0”调零;sockaddr_in";结构是否必要?,c++,c,sockets,language-lawyer,C++,C,Sockets,Language Lawyer,我到处都能看到以下代码: struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = ip; 在C++中,同样的思想通常表示为 sockaddr_in addr = {}; // unneccesary(?) value-initialzation addr.sin_famil

我到处都能看到以下代码:

struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ip;
在C++中,同样的思想通常表示为

sockaddr_in addr = {}; // unneccesary(?) value-initialzation
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ip;
然而,我看不到任何地方(就官方文件而言)有任何要求在设置这些成员之前将结构归零!是的,通常BSD套接字实现确实为中的
sockaddr\u定义了一个
sin\u zero
成员,但他们总是说该成员是填充所必需的,以便将
中的
sockaddr\u的大小与
sockaddr
对齐。他们从不要求一个人把任何具体的内容放进去

是否有任何真实的证明文件需要将结构归零

附言。 在您将问题作为有关
sockaddr\u中
memset
的几个SO问题中的一个问题的副本提交VTC之前,请确保您作为副本提出的问题与官方文件有任何链接,而不仅仅是关于“初始化未使用的成员以防万一”的猜测。

简短回答: IEEE标准不需要它


长答: 指定
中的
sockaddr\u的定义为(Emphasismine):

标题应定义结构中的sockaddr_,该结构 至少包括以下成员:

sau family\t sinu family AF\u INET.

in\u port\u t sin\u port端口号。

struct in\u addr sin\u addr IP地址。

请注意,与
sockaddr_in6
的定义不同,该定义规定应将其归零:

应用程序应将6
结构中的
sockaddr_设置为零
在使用它之前,由于实现可以自由地添加,
sockaddr\u in6
中的实现定义字段

中,没有类似的
sockaddr\u措词。然而,这种措词的缺乏给平台实现者带来了足够的模糊性,使得他们自己需要将
sockaddr\u的全部或部分归零

请注意,
中的
sockaddr\u的定义需要一个
sin\u zero
字段来填充结构,使其与
sockaddr
结构兼容:

Sinu zero成员已根据从结构中的sockaddr_中移除 开放组基础决议bwg2001-004

我们发现Windows和Linux之间存在差异。尽管该字段已从官方定义中删除,但Windows和Linux实现仍然包含该字段(因为“至少”一词并未明确表示非法)

对于Windows平台,
sin_zero
是否总是需要调零尚不清楚,但在年,作者进行了一些挖掘,并得出以下结论:

在某些体系结构上,它不会导致任何未清除的问题 零星。但在其他体系结构上可能会出现这种情况。其要求 清除
sin_zero
的规范,因此如果需要,必须执行此操作 您的代码现在和将来都不会有bug

关于“规范要求清除sin_zero
”的部分,我只能找到以下内容来支持该主张:

WSK应用程序应将此数组的内容设置为零

然而,我找不到Linux的类似措辞


因此,总而言之,在某些体系结构中,似乎至少需要将一个字段归零,而在其他体系结构中则不需要。我认为最好是安全的,把一切都归零。

晚会晚了一点——但这里有一些相关的东西,我认为这是值得在讨论中补充的。在Richard Stevens的第三版“Unix网络编程”第70页中,有以下内容:

“…绑定非通配符IPv4地址时,此成员必须为零(TCPv2第731-732页)”

史蒂文斯在这里提到了“TCPv2”-他所说的“成员”是
sin_zero
。这似乎与你的问题相吻合。。。至少在绑定的上下文中。请注意,他使用了单词must


无论这个答案是否符合“官方文件”的要求。。。我让你来决定!但正如其他人所说,无论它是否是官方的。。。当然,最好将
memset
设置为零(或者在结构变量定义中使用
={0};
)。这样,您就不用担心一件事了……

注意:不平衡的括号:
memset(&addr,0,sizeof(addr);
-->-->
memset(&addr,0,sizeof addr);
我删除了标记,因为它在这个上下文中没有意义。@black,它有意义,这就是问题所在。下面是标记描述:有关编程语言和环境的正式或权威规范的复杂性的问题"。我要求的是权威性规范。@SergeyA我应该说我不知道“环境”部分。但这是非常误导性的。此外,我看到的所有关于这种标签的问题都是关于语言形式的:毕竟,它是语言律师,而不是环境律师,因为语言独立于环境,让我们来谈谈一个正式的规范。猜一个关于meta的Q是值得的。他们终于停止使用
bzero
?这并没有回答我的问题。首先,它说了关于成为非C/C++标准的毫无意义的观点(每个人都知道这一点),然后在实现中详细介绍了关于Linux sockaddr\u的不正确的细节(它肯定有一个填充构件,以符合sockaddr结构的尺寸)最后谈到Windows内核套接字应用程序,我的问题不是。由于非标准性,有关特定于体系结构的实现的讨论似乎是相关的。如果我得到有关linux impl的任何详细信息,我深表歉意。我不想误导,