I've set a udp socket and call sendto() with a different recipient at each call.
I would like to use writev() in order to benefit scater/gather io but writev() does not allows me to specify the recipient addr/port as in sendto(). Any suggestions?
I've set a udp socket and call sendto() with a different recipient at each call.
I would like to use writev() in order to benefit scater/gather io but writev() does not allows me to specify the recipient addr/port as in sendto(). Any suggestions?
On Linux, there is sendmmsg(2)
The sendmmsg() system call is an extension of sendmsg(2) that allows the caller to transmit multiple messages on a socket using a single system call. (This has performance benefits for some applications.)
The prototype is:
int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned int flags);
struct mmsghdr {
struct msghdr msg_hdr; /* Message header */
unsigned int msg_len; /* Number of bytes transmitted */
};
Since both the address and the i/o vector is specified in struct msghdr
, you can both send to multiple destinations and make use of scatter/gather.
You can use
writev
to send a coalesced set of buffers to a single end point if you useconnect
to specify the end point beforehand. From the (OSX) manpage forconnect(2)
:You cannot use
writev
to send each buffer to a different endpoint.A potential downside of using
connect / writev
instead ofsendto
*n is that it is yet another system call perwritev
.If the set of recipients is limited (and known in advance) it may be preferable to use a separate
socket
per recipient and justconnect
each socket once.