table of contents
XS_SENDMSG(3) | Crossroads I/O Manual | XS_SENDMSG(3) |
NAME¶
xs_sendmsg - send a message part on a socket (zero-copy)
SYNOPSIS¶
int xs_sendmsg (void *socket, xs_msg_t *msg, int flags);
DESCRIPTION¶
The xs_sendmsg() function shall queue the message referenced by the msg argument to be sent to the socket referenced by the socket argument. The flags argument is a combination of the flags defined below:
XS_DONTWAIT
XS_SNDMORE
The xs_msg_t structure passed to xs_sendmsg() is nullified during the call. If you want to send the same message to multiple sockets you have to copy it using (e.g. using xs_msg_copy()).
Note
A successful invocation of xs_sendmsg() does not indicate that the message has been transmitted to the network, only that it has been queued on the socket and Crossroads have assumed responsibility for the message.
Multi-part messages¶
A Crossroads message is composed of 1 or more message parts. Each message part is an independent xs_msg_t in its own right. Crossroads ensure atomic delivery of messages; peers shall receive either all message parts of a message or none at all. The total number of message parts is unlimited except by available memory.
An application that sends multipart messages must use the XS_SNDMORE flag when sending each data part except the final one.
RETURN VALUE¶
The xs_sendmsg() function shall return number of bytes in the message if successful. Otherwise it shall return -1 and set errno to one of the values defined below.
ERRORS¶
EAGAIN
ENOTSUP
EFSM
ETERM
ENOTSOCK
EINTR
EFAULT
EXAMPLE¶
Filling in a message and sending it to a socket.
/* Create a new message, allocating 6 bytes for message content */ xs_msg_t msg; int rc = xs_msg_init_size (&msg, 6); assert (rc == 0); /* Fill in message content with 'AAAAAA' */ memset (xs_msg_data (&msg), 'A', 6); /* Send the message to the socket */ rc = xs_sendmsg (socket, &msg, 0); assert (rc == 6);
Sending a multi-part message.
/* Send a multi-part message consisting of three parts to socket */ rc = xs_sendmsg (socket, &part1, XS_SNDMORE); rc = xs_sendmsg (socket, &part2, XS_SNDMORE); /* Final part; no more parts to follow */ rc = xs_sendmsg (socket, &part3, 0);
SEE ALSO¶
Applications that do not require zero-copy messaging can use the simpler xs_send(3) instead of xs_sendmsg().
xs_recvmsg(3) xs_socket(7) xs(7)
AUTHORS¶
This man page was written by Martin Sustrik <sustrik@250bpm.com[1]>, Martin Lucina <martin@lucina.net[2]> and Pieter Hintjens <ph@imatix.com[3]>.
NOTES¶
- 1.
- sustrik@250bpm.com
- 2.
- martin@lucina.net
- 3.
- ph@imatix.com
06/13/2012 | Crossroads I/O 1.2.0 |