An application can control various features of SCTP by using the sendmsg function along with ancillary data (described in Chapter 14). However, because the use of ancillary data may be inconvenient, many SCTP implementations provide an auxiliary library call (possibly implemented as a system call) that eases an application's use of SCTP's advanced features. The call takes the following form:
ssize_t sctp_sendmsg(int sockfd , const void * msg , size_t msgsz , const struct sockaddr * to , socklen_t tolen , uint32_t ppid , uint32_t flags , uint16_t stream , uint32_t timetolive , uint32_t context ); |
Returns: the number of bytes written, 1 on error |
The user of sctp_sendmsg has a greatly simplified sending method at the cost of more arguments. The
sockfd field holds the socket descriptor returned from a socket system call. The
msg field points to a buffer of
msgsz bytes to be sent to the peer endpoint
to . The
tolen field holds the length of the address stored in
to . The
ppid field holds the pay-load protocol identifier that will be passed with the data chunk. The
flags field will be passed to the SCTP stack to identify any SCTP options; valid values for this field may be found in Figure 7.16.
A caller specifies an SCTP stream number by filling in the
stream . The caller may specify the lifetime of the message in milliseconds in the
lifetime field, where 0 represents an infinite lifetime. A user context, if any, may be specified in
context . A user context associates a failed message transmission, received via a message notification, with some local application-specific context. For example, to send a message to stream number 1, with the send flags set to MSG_PR_SCTP_TTL, the lifetime set to 1000 milliseconds, a payload protocol identifier of 24, and a context of 52, a user would formulate the following call:
ret = sctp_sendmsg(sockfd, data, datasz, &dest, sizeof(dest), 24, MSG_PR_SCTP_TTL, 1, 1000, 52);
This approach is much easier than allocating the necessary ancillary data and setting up the appropriate structures in the msghdr structure. Note that if an implementation maps the sctp_sendmsg to a sendmsg function call, the
flags field of the sendmsg call is set to 0.