Manual Pages for Linux CentOS command on man recvmmsg
MyWebUniversity

Manual Pages for Linux CentOS command on man recvmmsg

RECVMMSG(2) Linux Programmer's Manual RECVMMSG(2)

NAME

recvmmsg - receive multiple messages on a socket SYNOPSIS

#define GNUSOURCE

#include int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, unsigned int flags, struct timespec *timeout); DESCRIPTION The recvmmsg() system call is an extension of recvmsg(2) that allows the caller to receive multiple messages from a socket using a single system call. (This has performance benefits for some applications.) A further extension over recvmsg(2) is support for a timeout on the receive operation. The sockfd argument is the file descriptor of the socket to receive data from. The msgvec argument is a pointer to an array of mmsghdr structures. The size of this array is specified in vlen. The mmsghdr structure is defined in as: struct mmsghdr { struct msghdr msghdr; /* Message header */ unsigned int msglen; /* Number of received bytes for header */ }; The msghdr field is a msghdr structure, as described in recvmsg(2). The msglen field is the number of bytes returned for the message in the entry. This field has the same value as the return value of a sin‐ gle recvmsg(2) on the header. The flags argument contains flags ORed together. The flags are the same as documented for recvmsg(2), with the following addition: MSGWAITFORONE (since Linux 2.6.34) Turns on MSGDONTWAIT after the first message has been received. The timeout argument points to a struct timespec (see clockgettime(2)) defining a timeout (seconds plus nanoseconds) for the receive opera‐ tion. (This interval will be rounded up to the system clock granular‐ ity, and kernel scheduling delays mean that the blocking interval may overrun by a small amount.) If timeout is NULL then the operation blocks indefinitely. A blocking recvmmsg() call blocks until vlen messages have been received or until the timeout expires. A nonblocking call reads as many messages as are available (up to the limit specified by vlen) and returns immediately. On return from recvmmsg(), successive elements of msgvec are updated to contain information about each received message: msglen contains the size of the received message; the subfields of msghdr are updated as described in recvmsg(2). The return value of the call indicates the number of elements of msgvec that have been updated. RETURN VALUE On success, recvmmsg() returns the number of messages received in

msgvec; on error, -1 is returned, and errno is set to indicate the error. ERRORS Errors are as for recvmsg(2). In addition, the following error can occur: EINVAL timeout is invalid. See also BUGS. VERSIONS The recvmmsg() system call was added in Linux 2.6.33. Support in glibc was added in version 2.12. CONFORMING TO

recvmmsg() is Linux-specific. BUGS If an error occurs after at least one message has been received, the call succeeds, and returns the number of messages received. The error code is expected to be returned on a subsequent call to recvmmsq(). In the current implementation, however, the error code can be overwritten in the meantime by an unrelated network event on a socket, for example an incoming ICMP packet. EXAMPLE The following program uses recvmmsg() to receive multiple messages on a socket and stores them in multiple buffers. The call returns if all buffers are filled or if the timeout specified has expired. The following snippet periodically generates UDP datagrams containing a random number:

$ while true; do echo $RANDOM > /dev/udp/127.0.0.1/1234; sleep 0.25; done These datagrams are read by the example application, which can give the following output:

$ ./a.out 5 messages received 1 11782 2 11345 3 304 4 13514 5 28421 Program source

#define GNUSOURCE

#include

#include

#include

#include

#include int main(void) {

#define VLEN 10

#define BUFSIZE 200

#define TIMEOUT 1 int sockfd, retval, i; struct sockaddrin sa; struct mmsghdr msgs[VLEN]; struct iovec iovecs[VLEN]; char bufs[VLEN][BUFSIZE+1]; struct timespec timeout; sockfd = socket(AFINET, SOCKDGRAM, 0);

if (sockfd == -1) { perror("socket()"); exit(EXITFAILURE); } sa.sinfamily = AFINET; sa.sinaddr.saddr = htonl(INADDRLOOPBACK); sa.sinport = htons(1234);

if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -1) { perror("bind()"); exit(EXITFAILURE); } memset(msgs, 0, sizeof(msgs)); for (i = 0; i < VLEN; i++) { iovecs[i].iovbase = bufs[i]; iovecs[i].iovlen = BUFSIZE; msgs[i].msghdr.msgiov = &iovecs[i]; msgs[i].msghdr.msgiovlen = 1; } timeout.tvsec = TIMEOUT; timeout.tvnsec = 0; retval = recvmmsg(sockfd, msgs, VLEN, 0, &timeout);

if (retval == -1) { perror("recvmmsg()"); exit(EXITFAILURE); }

printf("%d messages received\n", retval); for (i = 0; i < retval; i++) { bufs[i][msgs[i].msglen] = 0;

printf("%d %s", i+1, bufs[i]); } exit(EXITSUCCESS); } SEE ALSO clockgettime(2), recvmsg(2), sendmmsg(2), sendmsg(2), socket(2), socket(7) COLOPHON

This page is part of release 3.53 of the Linux man-pages project. A description of the project, and information about reporting bugs, can

be found at http://www.kernel.org/doc/man-pages/.

Linux 2012-12-24 RECVMMSG(2)




Contact us      |      About us      |      Term of use      |       Copyright © 2000-2019 MyWebUniversity.com ™