以下はsockaddr_storage構造(rfc2553)の定義です。 rfc2553によれば、sockaddr_storage は64ビット境界に位置合わせされ、sockaddr_inとsockaddr_in6の両方を保持できる必要があります。 また、atlest __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?
};
ユーザーがアクセスすることになっていることを@Dale、SOCKADDR_STORAGEで唯一のフィールドは、__ss_familyです。したがって、フィールドの残りの部分が64ビットの境界に揃えられていても、どのように役立つでしょうか?また、私は間違っていたsockaddr_in6ではなく、sockaddr_storageは、64ビット境界に位置合わせされることになっています。 – chappar
構造体または共用体に64ビット境界整列を必要とするメンバ(たとえば、uint64_t)が含まれている場合、構造体自体は64ビット境界に配置されます。さもなければ、そのメンバーが一直線にとどまることを保証する方法はありません。もちろん、構造体自体が64ビットで整列されている場合、最初のフィールド( '__ss_family')も64ビットに整列されます。 – mark4o