【发布时间】:2014-08-31 05:12:36
【问题描述】:
有没有明确的指南说我们必须将 sockaddr_in 结构初始化为零?
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
每当我查看真实的代码、示例或书籍时,它总是具有类似于以下的代码结构:
struct sockaddr_in foo;
memset(&foo, 0, sizeof(foo));
foo.sin_port = htons(1025);
foo.sin_family = AF_INET;
inet_pton(AF_INET, "10.0.0.1", &foo.sin_addr);
我知道有些消息来源说char sin_zero[8] 成员用于填充,应该设置为零,但为什么要将其余部分归零。尤其是当它们在大多数情况下在接下来的几行声明中被初始化时。甚至关于 beej 编程指南 said it is not mandatory to zero them out anymore 的 sin_zero 成员。我一直在寻找解释,但没有任何结果。这个stack overflow question 对初始化本身有一些不同的建议,但没有解释为什么需要归零。
这是一种传统做法还是我错过了什么真正的原因?任何参考表示赞赏。
【问题讨论】:
-
它确保您不会得到依赖于垃圾值的代码。这样的代码会产生海森bug等难以调试的bug。
-
或者只是
struct sockaddr_in foo = { AF_INET, htons(1025) };- 更短,并且仅将剩余成员归零。
标签: c++ sockets network-programming memset