Ser*_*eyA 9 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;
Run Code Online (Sandbox Code Playgroud)
在C++中,同样的想法通常表示为
sockaddr_in addr = {}; // unneccesary(?) value-initialzation
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = ip;
Run Code Online (Sandbox Code Playgroud)
然而,在我设置这些成员之前,我没有看到(在官方文档方面)我有任何要求将结构清零!是的,通常BSD套接字实现做有一个sin_zero用于定义的成员sockaddr_in,但他们总是说需要进行填充成员,对齐的大小sockaddr_in用sockaddr.他们从不要求人们将任何具体内容放入其中.
有没有真正的,文件证明需要零出结构?
PS之前VTC问题的若干SO一个问题的有关副本memset上sockaddr_in,请确保该问题您所提出的建议为重复有正式文件,而不是"以防万一未使用成员的初始化"只是猜测的任何链接.
IEEE标准不要求它.
在IEEE标准1003.1规定的定义sockaddr_in是(重点煤矿):
标题应定义至少包含以下成员的sockaddr_in结构:
sa_family_t sin_family AF_INET.
in_port_t sin_port Port number.
struct in_addr sin_addr IP address.
请注意,与定义不同sockaddr_in6,后者指定应将其清零:
的
sockaddr_in6结构应之前,使用它的应用程序被设置为零,因为实施方式可以自由地在附加的,执行定义的字段sockaddr_in6.
没有类似的措辞sockaddr_in.然而,这种缺乏措辞使得平台实现者有足够的模糊性来制定他们自己关于将全部或部分归零的要求sockaddr_in.
请注意,sockaddr_in 用于要求sin_zero字段填充结构以使其与sockaddr结构兼容的定义:
根据The Open Group Base Resolution bwg2001-004,sin_zero成员从sockaddr_in结构中删除.
而且这与sin_zero我们发现Windows和Linux之间的差异.尽管该字段已从官方定义中删除,但Windows和Linux实现仍然包含它(因为由于"至少"的措辞,它并非明确非法).
是否sin_zero总是要求对Windows平台进行清零还不清楚,但在这篇博客文章中,作者做了一些挖掘并提出了以下内容:
在某些架构上,它不会导致任何不清除sin_zero的问题.但在其他架构上它可能会.规范要求清除它
sin_zero,因此如果您希望您的代码现在和将来都没有bug,则必须这样做.
对于"规范要求清除sin_zero"的部分,我只能找到以下Windows文档(对于Winsock内核)似乎支持声明:
WSK应用程序应将此数组的内容设置为零.
但是,我发现Linux没有类似的措辞.
总而言之,似乎在某些体系结构中,您需要将至少一个字段清零,而在其他体系结构中则不需要.我认为最好是保持安全并将所有事情都归零.
| 归档时间: |
|
| 查看次数: |
1048 次 |
| 最近记录: |