заголовки основных сокетов (main sockets header)
Использование в приложениях (Application usage)
To forestall portability problems, it is recommended that
applications not use values larger than 231 -1 for the socklen_t
type.
The sockaddr_storage
structure solves the problem of declaring
storage for automatic variables which is both large enough and
aligned enough for storing the socket address data structure of
any family. For example, code with a file descriptor and without
the context of the address family can pass a pointer to a
variable of this type, where a pointer to a socket address
structure is expected in calls such as getpeername(), and
determine the address family by accessing the received content
after the call.
The example below illustrates a data structure which aligns on a
64-bit boundary. An implementation-defined field _ss_align
following _ss_pad1 is used to force a 64-bit alignment which
covers proper alignment good enough for needs of at least
sockaddr_in6
(IPv6) and sockaddr_in
(IPv4) address data
structures. The size of padding field _ss_pad1 depends on the
chosen alignment boundary. The size of padding field _ss_pad2
depends on the value of overall size chosen for the total size of
the structure. This size and alignment are represented in the
above example by implementation-defined (not required) constants
_SS_MAXSIZE (chosen value 128) and _SS_ALIGNMENT (with chosen
value 8). Constants _SS_PAD1SIZE (derived value 6) and
_SS_PAD2SIZE (derived value 112) are also for illustration and
not required. The implementation-defined definitions and
structure field names above start with an <underscore> to denote
implementation private name space. Portable code is not expected
to access or reference those fields or constants.
/*
* Desired design of maximum size and alignment.
*/
#define _SS_MAXSIZE 128
/* Implementation-defined maximum size. */
#define _SS_ALIGNSIZE (sizeof(int64_t))
/* Implementation-defined 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-defined.
*/
char _ss_pad1[_SS_PAD1SIZE];
/* 6-byte pad; this is to make implementation-defined
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. */
};