struct cmsghdr *CMSG_FIRSTHDR(struct
msghdr *msgh);
struct cmsghdr *CMSG_NXTHDR(struct
msghdr *msgh, struct cmsghdr *cmsg);
size_t CMSG_ALIGN(size_t length);
size_t CMSG_SPACE(size_t length);
size_t CMSG_LEN(size_t length);
unsigned char *CMSG_DATA(struct cmsghdr
*cmsg);
struct cmsghdr {
socklen_t cmsg_len; /* data byte count, including header */
int cmsg_level; /* originating protocol */
int cmsg_type; /* protocol-specific type */
/* followed by unsigned char
cmsg_data[]; */
};
DESCRIPTION
These
macros are used to create and access control messages
(also called ancillary data) that are not a part of the socket payload. This control information may include the
interface the packet was received on, various rarely used header fields, an
extended error description, a
set of file
descriptors or Unix credentials.
For instance, control messages can be used to send additional header fields such as IP options. Ancillary data is sent by calling sendmsg
and received by calling recvmsg.
Ancillary data is a sequence of struct cmsghdr
structures with appended data. This
sequence should only be accessed using the macros described in this manual page and never
directly. See the specific protocol man
pages for the available control message
types. The maximum ancillary buffer size allowed per
socket can be set using /proc/sys/net/core/optmem_max;.
CMSG_FIRSTHDR() returns a pointer to the
first cmsghdr in the ancillary data buffer associated with the passed msghdr.
CMSG_NXTHDR() returns
the next valid
cmsghdr after the passed cmsghdr. It returns NULL when there isnât enough space left in the buffer.
CMSG_ALIGN(), given a length, returns it including the required alignment. This is a constant expression.
CMSG_SPACE() returns the number of bytes
an ancillary element with payload of the passed data length occupies. This
is a constant expression.
CMSG_DATA() returns a pointer to the
data portion of a cmsghdr.
CMSG_LEN() returns
the value to store in the
cmsg_len member of the cmsghdr structure, taking into account any necessary
alignment.
It takes the data length as an
argument. This is a constant expression.
To create ancillary data, first
initialize the msg_controllen member of the msghdr with the length of the
control message buffer. Use CMSG_FIRSTHDR() on
the msghdr to get the first
control message and CMSG_NEXTHDR() to get all subsequent ones. In each control message, initialize cmsg_len (with CMSG_LEN()),
the other cmsghdr header fields, and the data portion using CMSG_DATA().Finally, the msg_controllen field
of the msghdr should be set to the sum of the CMSG_SPACE() of the length
of all control messages in the buffer. For more information on the msghdr, see
recvmsg.
When the control message buffer is too short to store all messages, the MSG_CTRUNC flag is set in the msg_flags member of the msghdr.
For portability, ancillary data should
be accessed only using the macros described here. CMSG_ALIGN() is a Linux extension and should be not used in portable programs.
In Linux, CMSG_LEN(), CMSG_DATA(), and
CMSG_ALIGN() are constant expressions (assuming their argument is constant);
this could be used to declare the size of global
variables. This may be not portable,
however.
See Also:
No comments:
Post a Comment