Movatterモバイル変換


[0]ホーム

URL:


man7.org > Linux >man-pages

Linux/UNIX system programming training


recvmmsg(2) — Linux manual page

NAME |LIBRARY |SYNOPSIS |DESCRIPTION |RETURN VALUE |ERRORS |STANDARDS |HISTORY |BUGS |EXAMPLES |SEE ALSO |COLOPHON

recvmmsg(2)                System Calls Manualrecvmmsg(2)

NAME        top

       recvmmsg - receive multiple messages on a socket

LIBRARY        top

       Standard C library (libc,-lc)

SYNOPSIS        top

#define _GNU_SOURCE/* See feature_test_macros(7) */#include <sys/socket.h>int recvmmsg(unsigned int n;intsockfd, struct mmsghdrmsgvec[n], unsigned intn,intflags, struct timespec *timeout);

DESCRIPTION        top

       Therecvmmsg() system call is an extension ofrecvmsg(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 overrecvmsg(2) is support for       a timeout on the receive operation.       Thesockfd argument is the file descriptor of the socket to       receive data from.       Themsgvec argument is a pointer to an array ofmmsghdr       structures.  The size of this array is specified inn.       Themmsghdr structure is defined in<sys/socket.h> as:           struct mmsghdr {               struct msghdr msg_hdr;  /* Message header */               unsigned int  msg_len;  /* Number of received bytes for header */           };       Themsg_hdr field is amsghdr structure, as described inrecvmsg(2).  Themsg_len 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 singlerecvmsg(2) on the header.       Theflags argument contains flags ORed together.  The flags are       the same as documented forrecvmsg(2), with the following       addition:MSG_WAITFORONE(since Linux 2.6.34)              Turns onMSG_DONTWAITafter the first message has been              received.       Thetimeout argument points to astruct timespec (seeclock_gettime(2)) defining a timeout (seconds plus nanoseconds)       for the receive operation (but see BUGS!).  (This interval will be       rounded up to the system clock granularity, and kernel scheduling       delays mean that the blocking interval may overrun by a small       amount.)  Iftimeout is NULL, then the operation blocks       indefinitely.       A blockingrecvmmsg() call blocks untiln messages have been       received or until the timeout expires.  A nonblocking call reads       as many messages as are available (up to the limit specified byn)       and returns immediately.       On return fromrecvmmsg(), successive elements ofmsgvec are       updated to contain information about each received message:msg_len contains the size of the received message; the subfields       ofmsg_hdr are updated as described inrecvmsg(2).  The return       value of the call indicates the number of elements ofmsgvec that       have been updated.

RETURN VALUE        top

       On success,recvmmsg() returns the number of messages received inmsgvec; on error, -1 is returned, anderrno is set to indicate the       error.

ERRORS        top

       Errors are as forrecvmsg(2).  In addition, the following error       can occur:EINVALtimeout is invalid.       See also BUGS.

STANDARDS        top

       Linux.

HISTORY        top

       Linux 2.6.33, glibc 2.12.

BUGS        top

       Thetimeout argument does not work as intended.  The timeout is       checked only after the receipt of each datagram, so that if up ton-1 datagrams are received before the timeout expires, but then no       further datagrams are received, the call will block forever.       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 torecvmmsg().  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.

EXAMPLES        top

       The following program usesrecvmmsg() 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 28421Program source       #define _GNU_SOURCE       #include <arpa/inet.h>       #include <netinet/in.h>       #include <stdio.h>       #include <stdlib.h>       #include <string.h>       #include <sys/socket.h>       #include <time.h>       int       main(void)       {       #define VLEN 10       #define BUFSIZE 200       #define TIMEOUT 1           int                 sockfd, retval;           char                bufs[VLEN][BUFSIZE+1];           struct iovec        iovecs[VLEN];           struct mmsghdr      msgs[VLEN];           struct timespec     timeout;           struct sockaddr_in  addr;           sockfd = socket(AF_INET, SOCK_DGRAM, 0);           if (sockfd == -1) {               perror("socket()");               exit(EXIT_FAILURE);           }           addr.sin_family = AF_INET;           addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);           addr.sin_port = htons(1234);           if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {               perror("bind()");               exit(EXIT_FAILURE);           }           memset(msgs, 0, sizeof(msgs));           for (size_t i = 0; i < VLEN; i++) {               iovecs[i].iov_base         = bufs[i];               iovecs[i].iov_len          = BUFSIZE;               msgs[i].msg_hdr.msg_iov    = &iovecs[i];               msgs[i].msg_hdr.msg_iovlen = 1;           }           timeout.tv_sec = TIMEOUT;           timeout.tv_nsec = 0;           retval = recvmmsg(sockfd, msgs, VLEN, 0, &timeout);           if (retval == -1) {               perror("recvmmsg()");               exit(EXIT_FAILURE);           }           printf("%d messages received\n", retval);           for (size_t i = 0; i < retval; i++) {               bufs[i][msgs[i].msg_len] = 0;               printf("%zu %s", i+1, bufs[i]);           }           exit(EXIT_SUCCESS);       }

SEE ALSO        top

clock_gettime(2),recvmsg(2),sendmmsg(2),sendmsg(2),socket(2),socket(7)

COLOPHON        top

       This page is part of theman-pages (Linux kernel and C library       user-space interface documentation) project.  Information about       the project can be found at        ⟨https://www.kernel.org/doc/man-pages/⟩.  If you have a bug report       for this manual page, see       ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩.       This page was obtained from the tarball man-pages-6.16.tar.gz       fetched from       ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩ on       2026-01-16.  If you discover any rendering problems in this HTML       version of the page, or you believe there is a better or more up-       to-date source for the page, or you have corrections or       improvements to the information in this COLOPHON (which isnot       part of the original manual page), send a mail to       man-pages@man7.orgLinux man-pages 6.16            2025-08-20recvmmsg(2)

Pages that refer to this page:recv(2)sendmmsg(2)syscalls(2)signal(7)



HTML rendering created 2026-01-16 byMichael Kerrisk, author ofThe Linux Programming Interface.

For details of in-depthLinux/UNIX system programming training courses that I teach, lookhere.

Hosting byjambit GmbH.

Cover of TLPI


[8]ページ先頭

©2009-2026 Movatter.jp