下面是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,只有在struct sockaddr_storage的領域,用戶應該訪問__ss_family。所以,即使其餘的字段都對齊到64位的邊界,這將如何幫助?此外,我錯了,它是sockaddr_in6而不是sockaddr_storage應該對齊到64位邊界。 – chappar 2009-08-28 08:22:50
如果結構或聯合包含需要64位對齊的任何成員(例如'uint64_t'),則結構本身將被放置在64位邊界上。否則,將無法保證該成員將保持一致。當然,如果結構本身是64位對齊的,那麼第一個字段('__ss_family')也將是64位對齊的。 – mark4o 2009-08-28 14:07:04