recvmmsg(2) - wariua/manpages-ko GitHub Wiki

NAME

recvmmsg - ์†Œ์ผ“์—์„œ ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ฐ›๊ธฐ

SYNOPSIS

#define _GNU_SOURCE         /* feature_test_macros(7) ์ฐธ๊ณ  */
#include <sys/socket.h>

int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
             int flags, struct timespec *timeout);

DESCRIPTION

recvmmsg() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ recvmsg(2)๋ฅผ ํ™•์žฅํ•œ ๊ฒƒ์ด๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํ•œ ๋ฒˆ์œผ๋กœ ์†Œ์ผ“์—์„œ ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค. (์ผ๋ถ€ ์‘์šฉ์—์„œ ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ์žˆ๋‹ค.) ๋˜ recvmsg(2)๋ฅผ ํ™•์žฅํ•ด์„œ ์ˆ˜์‹  ๋™์ž‘์˜ ํƒ€์ž„์•„์›ƒ์„ ์ง€์›ํ•œ๋‹ค.

sockfd ์ธ์ž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์†Œ์ผ“์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์ด๋‹ค.

msgvec ์ธ์ž๋Š” mmsghdr ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๋‹ค. ์ด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ vlen์— ์ง€์ •ํ•œ๋‹ค.

mmsghdr ๊ตฌ์กฐ์ฒด๋Š” <sys/socket.h>์— ๋‹ค์Œ์ฒ˜๋Ÿผ ์ •์˜๋ผ ์žˆ๋‹ค.

struct mmsghdr {
    struct msghdr msg_hdr;  /* ๋ฉ”์‹œ์ง€ ํ—ค๋” */
    unsigned int  msg_len;  /* ์ˆ˜์‹ ํ•œ ๋ฐ”์ดํŠธ ์ˆ˜ */
};

msg_hdr ํ•„๋“œ๋Š” recvmsg(2)์—์„œ ๊ธฐ์ˆ ํ•˜๋Š” msghdr ๊ตฌ์กฐ์ฒด์ด๋‹ค. msg_len ํ•„๋“œ๋Š” ๊ทธ ํ•ญ๋ชฉ์˜ ๋ฉ”์‹œ์ง€์˜ ๋ฐ˜ํ™˜ ๋ฐ”์ดํŠธ ์ˆ˜์ด๋‹ค. ์ด ํ•„๋“œ์˜ ๊ฐ’์€ ๊ทธ ํ—ค๋”์— ๋Œ€ํ•ด ๋”ฐ๋กœ recvmsg(2)๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ์˜ ๋ฐ˜ํ™˜ ๊ฐ’๊ณผ ๊ฐ™๋‹ค.

flags ์ธ์ž๋Š” OR ํ•œ ํ”Œ๋ž˜๊ทธ๋“ค์„ ๋‹ด๋Š”๋‹ค. recvmsg(2)์— ๊ธฐ๋ก๋œ ๊ฒƒ๋“ค์— ๋”ํ•ด ๋‹ค์Œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋‹ค.

MSG_WAITFORONE (๋ฆฌ๋ˆ…์Šค 2.6.34๋ถ€ํ„ฐ)
์ฒซ ๋ฒˆ์งธ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•œ ํ›„์— MSG_DONTWAIT์„ ์ผ ๋‹ค.

timeout ์ธ์ž๋Š” struct timespec(clock_gettime(2) ์ฐธ๊ณ )์„ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ ์ˆ˜์‹  ๋™์ž‘์˜ ํƒ€์ž„์•„์›ƒ(์ดˆ ๋”ํ•˜๊ธฐ ๋‚˜๋…ธ์ดˆ)์„ ์ง€์ •ํ•œ๋‹ค. (ํ•˜์ง€๋งŒ BUGS ์ฐธ๊ณ .) (์ด ์‹œ๊ฐ„์„ ์‹œ์Šคํ…œ ํด๋Ÿญ ํ•ด์ƒ๋„์— ๋”ฐ๋ผ ์˜ฌ๋ฆผ ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ปค๋„ ์Šค์ผ€์ค„๋ง ์ง€์—ฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ธ”๋ก ์‹œ๊ฐ„์„ ์•ฝ๊ฐ„ ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.) timeout์ด NULL์ด๋ฉด ๋™์ž‘์ด ์˜์›ํžˆ ๋ธ”๋ก ํ•œ๋‹ค.

๋ธ”๋กœํ‚น recvmmsg() ํ˜ธ์ถœ์€ vlen ๊ฐœ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ฑฐ๋‚˜ ํƒ€์ž„์•„์›ƒ์ด ๋งŒ๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ธ”๋ก ํ•œ๋‹ค. ๋…ผ๋ธ”๋กœํ‚น ํ˜ธ์ถœ์€ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๋ฉ”์‹œ์ง€๋ฅผ (vlen์œผ๋กœ ์ง€์ •ํ•œ ํ•œ๊ณ„๊นŒ์ง€) ์ฝ์–ด ๋“ค์ด๊ณ ์„œ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

recvmmsg()์—์„œ ๋ฐ˜ํ™˜ ์‹œ msgvec์˜ ์—ฐ์†๋œ ํ•ญ๋ชฉ๋“ค์ด ๊ฐ ์ˆ˜์‹  ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋„๋ก ๊ฐฑ์‹ ๋˜์–ด ์žˆ๋‹ค. msg_len์€ ์ˆ˜์‹  ๋ฉ”์‹œ์ง€์˜ ํฌ๊ธฐ๋ฅผ ๋‹ด๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  msg_hdr์˜ ํ•˜์œ„ ํ•„๋“œ๋“ค์ด recvmsg(2)์—์„œ ๊ธฐ์ˆ ํ•˜๋Š” ๋Œ€๋กœ ๊ฐฑ์‹ ๋˜์–ด ์žˆ๋‹ค. ํ˜ธ์ถœ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ๊ฐฑ์‹ ๋œ msgvec ํ•ญ๋ชฉ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ recvmmsg()๋Š” msgvec์— ๋ฐ›์€ ๋ฉ”์‹œ์ง€ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋„๋ก errno๋ฅผ ์„ค์ •ํ•œ๋‹ค.

ERRORS

์˜ค๋ฅ˜๋“ค์ด recvmsg(2)์—์„œ์™€ ๊ฐ™๋‹ค. ์ถ”๊ฐ€๋กœ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

EINVAL
timeout์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค.

BUGS๋„ ์ฐธ๊ณ .

VERSIONS

๋ฆฌ๋ˆ…์Šค 2.6.33์—์„œ recvmmsg() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. glibc ๋ฒ„์ „ 2.12์—์„œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

CONFORMING TO

recvmmsg()๋Š” ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค.

BUGS

timeout ์ธ์ž๊ฐ€ ์˜๋„ ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ ๋ฐ์ดํ„ฐ๊ทธ๋žจ ์ˆ˜์‹  ํ›„์—๋งŒ ํƒ€์ž„์•„์›ƒ์„ ํ™•์ธํ•˜๋ฉฐ, ๋”ฐ๋ผ์„œ ํƒ€์ž„์•„์›ƒ ๋งŒ๋ฃŒ ์ „์— vlen-1 ๊ฐœ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ์ˆ˜์‹ ํ•˜๊ณ ์„œ ์ดํ›„ ๋”๋Š” ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ์ˆ˜์‹ ํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜ธ์ถœ์ด ์˜์›ํžˆ ๋ธ”๋ก ํ•˜๊ฒŒ ๋œ๋‹ค.

์ตœ์†Œ ํ•œ ๊ฐœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์€ ํ›„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ•˜๊ณ  ๋ฐ›์€ ๋ฉ”์‹œ์ง€ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์ฝ”๋“œ๋Š” ์ด์–ด์ง€๋Š” recvmmsg()์—์„œ ๋ฐ˜ํ™˜๋˜๋„๋ก ๋ผ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ ๊ตฌํ˜„์—์„œ๋Š” ์†Œ์ผ“์—์„œ์˜ ๊ด€๋ จ ์—†๋Š” ๋„คํŠธ์›Œํฌ ์ด๋ฒคํŠธ(๊ฐ€๋ น ICMP ํŒจํ‚ท ์ž…๋ ฅ) ๋•Œ๋ฌธ์— ๊ทธ ์‚ฌ์ด์— ์˜ค๋ฅ˜ ์ฝ”๋“œ๊ฐ€ ๋ฎ์–ด ์จ์งˆ ์ˆ˜ ์žˆ๋‹ค.

EXAMPLE

๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” recvmmsg()๋ฅผ ์‚ฌ์šฉํ•ด ์†Œ์ผ“์—์„œ ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„์„œ ์—ฌ๋Ÿฌ ๋ฒ„ํผ์— ์ €์žฅํ•œ๋‹ค. ๋ชจ๋“  ๋ฒ„ํผ๊ฐ€ ์ฐจ๊ฑฐ๋‚˜ ์ง€์ •ํ•œ ํƒ€์ž„์•„์›ƒ์ด ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ์— ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์€ ๋‚œ์ˆ˜๋ฅผ ๋‹ด์€ UDP ๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

$ while true; do echo $RANDOM > /dev/udp/127.0.0.1/1234;
      sleep 0.25; done

๊ทธ ๋ฐ์ดํ„ฐ๊ทธ๋žจ๋“ค์„ ์˜ˆ์‹œ ์‘์šฉ์ด ์ฝ์–ด ๋“ค์—ฌ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅํ•œ๋‹ค.

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

ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค

#define _GNU_SOURCE
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>

int
main(void)
{
#define VLEN 10
#define BUFSIZE 200
#define TIMEOUT 1
    int sockfd, retval, i;
    struct sockaddr_in addr;
    struct mmsghdr msgs[VLEN];
    struct iovec iovecs[VLEN];
    char bufs[VLEN][BUFSIZE+1];
    struct timespec timeout;

    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 (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 (i = 0; i < retval; i++) {
        bufs[i][msgs[i].msg_len] = 0;
        printf("%d %s", i+1, bufs[i]);
    }
    exit(EXIT_SUCCESS);
}

SEE ALSO

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


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ