c++ - 为什么 memset sockaddr_in 为 0

标签 c++ sockets network-programming memset

是否有明确的指南说明我们必须出于特定原因将 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] 成员在那里用于填充并且应该设置为零但为什么要将其余部分归零。特别是当它们在大多数情况下在接下来的几行声明中被初始化时。甚至关于 sin_zero 成员的 beej 编程指南 said it is not mandatory to zero them out anymore .我已经搜索了一个解释,但没有找到任何要点。这stack overflow question对初始化本身有一些不同的建议,但没有解释为什么需要调零。

这是遗留的做法还是有一些真正的原因我错过了?感谢任何引用。

最佳答案

将其视为默认构造函数,即将数据初始化为已知值(在本例中为 0)。这有助于缓解使用 POD 时与未初始化数据相关的问题,例如忘记设置成员,尽管 memset 并不是真正必需的,您可以使用 sockaddr_in 对结构进行值初始化foo{};(顺便说一句,这也会在幕后产生更好的汇编代码,因为编译器可以movq 0一切而不是调用memset,不是说它'在 99% 的情况下会有很大的不同)。

如果您完全确定要设置所有成员,那么这并不是绝对必要的,尽管如果您忘记初始化某些东西,它可以帮助您及早发现错误。

关于c++ - 为什么 memset sockaddr_in 为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24666186/

相关文章:

c++ - 在记录集中搜索/更新值

c++ - 如何使用自动工具将测试单元添加到共享库项目

c++ - std::declval() 在 GCC 中触发断言错误并发出警告

c - 通过非特权套接字在应用程序级别获取 ICMP 消息内容

c++ - Linux 服务器,向 Windows 客户端发送文件(Socket)

java - 通过 LAN 唤醒从 Android 手机唤醒笔记本电脑

c# - 在多宿主 Windows 10 计算机上接收 UDP 多播消息

c - 以编程方式在 C 中设置 MTU

c++ - 为什么在 ADL 中重载优先于显式特化

java - 如何在Java(TelNet)中实现接收套接字的事件?