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?
wkz
On
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.
Copyright © 2021 Jogjafile Inc.
You can use
writevto send a coalesced set of buffers to a single end point if you useconnectto specify the end point beforehand. From the (OSX) manpage forconnect(2):You cannot use
writevto send each buffer to a different endpoint.A potential downside of using
connect / writevinstead 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
socketper recipient and justconnecteach socket once.