为什么sizeof操作员返回的结构尺寸大于结构成员的总尺寸?
任何人都可以描述(struct sockaddr *)&server这里的运作方式 是否有可能将更大的结构转换为更小的结构?
看到这些结构:
// 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 in_addr {
unsigned long s_addr; // load with inet_pton()
};
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
Run Code Online (Sandbox Code Playgroud)
这是主要计划:
int main(int argc , char …Run Code Online (Sandbox Code Playgroud) 按照我之前的问题,我对这段代码非常好奇 -
case AF_INET:
{
struct sockaddr_in * tmp =
reinterpret_cast<struct sockaddr_in *> (&addrStruct);
tmp->sin_family = AF_INET;
tmp->sin_port = htons(port);
inet_pton(AF_INET, addr, tmp->sin_addr);
}
break;
Run Code Online (Sandbox Code Playgroud)
在提出这个问题之前,我已经搜索了关于同一主题的SO,并对此主题进行了混合回答.例如,看到这个,这个和这个帖子说,使用这种代码在某种程度上是安全的.还有另一篇文章说使用工会来完成这样的任务,但是对接受的答案的评论再次提出不同意见.
微软关于相同结构的文档说 -
应用程序开发人员通常只使用SOCKADDR_STORAGE的ss_family成员.其余成员确保SOCKADDR_STORAGE可以包含IPv6或IPv4地址,并且适当填充结构以实现64位对齐.这种对齐使协议特定的套接字地址数据结构能够访问SOCKADDR_STORAGE结构中的字段而不会出现对齐问题.通过填充,SOCKADDR_STORAGE结构的长度为128个字节.
Opengroup的文件说明 -
标题应定义sockaddr_storage结构.该结构应为:
足够大以容纳所有支持的协议特定的地址结构
在适当的边界对齐,以便指向它的指针可以作为指向协议特定地址结构的指针,并用于访问这些结构的字段而没有对齐问题
socket的 man页面也说同样 -
此外,套接字API提供数据类型struct sockaddr_storage.此类型适用于容纳所有受支持的特定于域的套接字地址结构; 它足够大并且正确对齐.(特别是,它足以容纳IPv6套接字地址.)
我已经使用这两种类型转换看到多种实现C与C++语言在野外,现在我不确定的事实,哪一个是正确的,因为有一些帖子说上述的权利要求相矛盾- 这个和这个.
那么哪一个是填充sockaddr_storage结构的安全和正确的方法?这些指针转换是否安全?还是工会方法?我也知道这个getaddrinfo()电话,但对于刚刚填充结构的上述任务来说,这似乎有点复杂.memcpy还有另外一种推荐的方法,这样安全吗?