我用谷歌搜索了一下,有些人说“与 struct sockaddr 保持相同的大小”。但内核不会直接使用 sockaddr(对吗?)。使用时。内核会将其恢复到原来的样子。那么为什么需要零填充呢?
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
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 in_addr {
unsigned long s_addr; // load with inet_pton()
};
我能找到的两条更相关的信息是
- 将 sin_zero 设置为 0 http://silviocesare.wordpress.com/2007/10/22/setting-sin_zero-to-0-in-struct-sockaddr_in/
谈论一段代码not清除字节
这是一个错误。我看到这种情况偶尔发生。此错误可能会导致应用程序中出现未定义的行为。
接下来是一些解释
大多数网络代码不使用sockaddr_in,而是使用sockaddr。当您使用像 sendto 这样的函数时,您必须显式地将 sockaddr_in 或您正在使用的任何地址转换为 sockaddr。 sockaddr_in 与 sockaddr 的大小相同,但由于轻微的 hack,内部大小是相同的。
这个黑客就是 sin_zero。实际上,sockaddr_in 中有用数据的长度比 sockaddr 短。但差异是在 sockaddr_in 中使用一个小缓冲区填充的;该缓冲区是 sin_zero。
最后,可以在各个地方找到的信息
在某些架构上,不清除 sin_zero 不会导致任何问题。但在其他架构上可能会这样。规范要求清除 sin_zero,因此如果您希望代码现在和将来都没有错误,则必须执行此操作。
- sin_zero的使用 http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-February/000966.html
回答问题
为什么我们需要这个 8 字节填充?
和答案
Unix 网络编程第 3.2 章说:“POSIX 规范
结构体中只需要三个成员:sin_family、sin_addr 和
罪恶端口。符合 POSIX 标准的实现定义
额外的结构成员,这对于互联网套接字地址来说是正常的
结构。几乎所有实现都添加了 sin_zero 成员,以便所有套接字
地址结构的大小至少为 16 个字节。 ”
它有点像结构填充,可能是为额外字段保留的
未来。就像评论的那样,你永远不会使用它。
这与第一个链接一致。清除字节告诉接收者“我们这边没有使用这些字节”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)