以下是sockaddr_storage结构的定义(rfc2553)。根据rfc2553,sockaddr_storage应该与64位边界对齐,并且应该能够容纳sockaddr_in和sockaddr_in6。此外,它必须至少有一个__ss_family成员。其余字段是实现定义的。
我的问题是为什么sockaddr_storage被定义成上面那样?为什么不能定义成下面这样?
#define _SS_MAXSIZE 128 /* Implementation specific max size */
#define _SS_ALIGNSIZE (sizeof (int64_t))
/* Implementation specific desired alignment */
/*
* Definitions used for sockaddr_storage structure paddings design.
*/
#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (sa_family_t))
#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (sa_family_t)+
_SS_PAD1SIZE + _SS_ALIGNSIZE))
struct sockaddr_storage {
sa_family_t __ss_family; /* address family */
/* Following fields are implementation specific */
char __ss_pad1[_SS_PAD1SIZE];
/* 6 byte pad, this is to make implementation
/* specific pad up to alignment field that */
/* follows explicit in the data structure */
int64_t __ss_align; /* field to force desired structure */
/* storage alignment */
char __ss_pad2[_SS_PAD2SIZE];
/* 112 byte pad to achieve desired size, */
/* _SS_MAXSIZE value minus size of ss_family */
/* __ss_pad1, __ss_align fields is 112 */
};
我的问题是为什么sockaddr_storage被定义成上面那样?为什么不能定义成下面这样?
struct sockaddr_storage {
sa_family_t __ss_family; /* address family */
char __ss_pad[_SS_MAXSIZE - sizeof(sa_family_t) ]; //will there be any alignment issue here?
};
uint64_t
),则该结构体本身将放置在64位边界上。否则,就无法保证该成员保持对齐。当然,如果结构体本身是64位对齐的,则第一个字段(__ss_family
)也将是64位对齐的。 - mark4o