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

NAME

sendmmsg - μ†ŒμΌ“μœΌλ‘œ μ—¬λŸ¬ λ©”μ‹œμ§€ 보내기

SYNOPSIS

#define _GNU_SOURCE         /* feature_test_macros(7) μ°Έκ³  */
#include <sys/socket.h>

int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
             int flags);

DESCRIPTION

sendmmsg() μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ sendmsg(2)λ₯Ό ν™•μž₯ν•œ 것이닀. ν˜ΈμΆœμžκ°€ μ‹œμŠ€ν…œ 호좜 ν•œ 번으둜 μ†ŒμΌ“μ—μ„œ μ—¬λŸ¬ λ©”μ‹œμ§€λ₯Ό 전솑할 수 있게 ν•΄ μ€€λ‹€. (일뢀 μ‘μš©μ—μ„œ μ„±λŠ₯상 이점이 μžˆλ‹€.)

sockfd μΈμžλŠ” 데이터λ₯Ό 솑신할 μ†ŒμΌ“μ˜ 파일 λ””μŠ€ν¬λ¦½ν„°μ΄λ‹€.

msgvec μΈμžλŠ” mmsghdr ꡬ쑰체 배열에 λŒ€ν•œ 포인터이닀. 이 λ°°μ—΄μ˜ 크기λ₯Ό vlen에 μ§€μ •ν•œλ‹€.

mmsghdr κ΅¬μ‘°μ²΄λŠ” <sys/socket.h>에 λ‹€μŒμ²˜λŸΌ μ •μ˜λΌ μžˆλ‹€.

struct mmsghdr {
    struct msghdr msg_hdr;  /* λ©”μ‹œμ§€ 헀더 */
    unsigned int  msg_len;  /* μ „μ†‘ν•œ λ°”μ΄νŠΈ 수 */
};

msg_hdr ν•„λ“œλŠ” sendmsg(2)μ—μ„œ κΈ°μˆ ν•˜λŠ” msghdr ꡬ쑰체이닀. msg_len ν•„λ“œλ₯Ό μ΄μš©ν•΄ msg_hdr의 λ©”μ‹œμ§€μ—μ„œ 보낸 λ°”μ΄νŠΈ 수λ₯Ό λ°˜ν™˜ν•œλ‹€. (즉 λ”°λ‘œ sendmsg(2)λ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œμ˜ λ°˜ν™˜ κ°’κ³Ό κ°™λ‹€.)

flags μΈμžλŠ” OR ν•œ ν”Œλž˜κ·Έλ“€μ„ λ‹΄λŠ”λ‹€. ν”Œλž˜κ·Έλ“€μ€ sendmsg(2)μ—μ„œμ™€ κ°™λ‹€.

λΈ”λ‘œν‚Ή sendmmsg() ν˜ΈμΆœμ€ vlen개 λ©”μ‹œμ§€λ₯Ό 솑신할 λ•ŒκΉŒμ§€ 블둝 ν•œλ‹€. λ…ΌλΈ”λ‘œν‚Ή ν˜ΈμΆœμ€ κ°€λŠ₯ν•œ λ§Žμ€ λ©”μ‹œμ§€λ₯Ό (vlen으둜 μ§€μ •ν•œ ν•œκ³„κΉŒμ§€) λ³΄λ‚΄κ³ μ„œ μ¦‰μ‹œ λ°˜ν™˜ν•œλ‹€.

sendmmsg()μ—μ„œ λ°˜ν™˜ μ‹œ msgvec의 μ—°μ†λœ ν•­λͺ©λ“€μ˜ msg_len ν•„λ“œκ°€ λŒ€μ‘ν•˜λŠ” msg_hdrμ—μ„œμ˜ 전솑 λ°”μ΄νŠΈ 수λ₯Ό 담도둝 κ°±μ‹ λ˜μ–΄ μžˆλ‹€. 호좜의 λ°˜ν™˜ 값은 κ°±μ‹ λœ msgvec ν•­λͺ© 개수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

RETURN VALUE

성곡 μ‹œ sendmmsg()λŠ” msgvecμ—μ„œ 보낸 λ©”μ‹œμ§€ 개수λ₯Ό λ°˜ν™˜ν•œλ‹€. κ·Έ 값이 vlen보닀 μž‘μ€ 경우 ν˜ΈμΆœμžκ°€ sendmmsg()λ₯Ό μΆ”κ°€λ‘œ ν˜ΈμΆœν•΄μ„œ λ‚˜λ¨Έμ§€ λ©”μ‹œμ§€λ“€μ„ 보내렀 ν•  수 μžˆλ‹€.

였λ₯˜ μ‹œ -1을 λ°˜ν™˜ν•˜λ©° 였λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄λ„λ‘ errnoλ₯Ό μ„€μ •ν•œλ‹€.

ERRORS

였λ₯˜λ“€μ΄ sendmsg(2)μ—μ„œμ™€ κ°™λ‹€. μ–΄λ–€ λ°μ΄ν„°κ·Έλž¨λ„ 보낼 수 μ—†μ—ˆλ˜ κ²½μš°μ—λ§Œ 였λ₯˜λ₯Ό λ°˜ν™˜ν•œλ‹€. BUGS도 μ°Έκ³ .

VERSIONS

λ¦¬λˆ…μŠ€ 3.0μ—μ„œ sendmmsg() μ‹œμŠ€ν…œ 호좜이 μΆ”κ°€λ˜μ—ˆλ‹€. glibc 버전 2.14μ—μ„œ 지원이 μΆ”κ°€λ˜μ—ˆλ‹€.

CONFORMING TO

sendmmsg()λŠ” λ¦¬λˆ…μŠ€ μ „μš©μ΄λ‹€.

NOTES

vlen에 μ§€μ •ν•  수 μžˆλŠ” κ°’μ˜ ν•œλ„κ°€ UIO_MAXIOV(1024)이닀.

BUGS

μ΅œμ†Œ ν•œ 개 λ©”μ‹œμ§€λ₯Ό 보낸 후에 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 호좜이 μ„±κ³΅ν•˜κ³  보낸 λ©”μ‹œμ§€ 수λ₯Ό λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ½”λ“œλŠ” μœ μ‹€λœλ‹€. ν˜ΈμΆœμžκ°€ μ‹€νŒ¨ν•œ 첫 번째 λ©”μ‹œμ§€λΆ€ν„° 전솑을 μž¬μ‹œλ„ν•  수 μžˆμ§€λ§Œ κ·Έλ•Œ μ„€λ Ή 였λ₯˜κ°€ λ°œμƒν•œλ‹€κ³  해도 그게 이전 ν˜ΈμΆœμ—μ„œ μœ μ‹€λœ 것과 같은 였λ₯˜λΌλŠ” 보μž₯이 μ—†λ‹€.

EXAMPLE

μ•„λž˜ μ˜ˆμ—μ„œλŠ” sendmmsg()λ₯Ό μ‚¬μš©ν•΄ μ‹œμŠ€ν…œ 호좜 ν•œ 번으둜 UDP λ°μ΄ν„°κ·Έλž¨ 두 κ°œμ— onetwo와 threeλ₯Ό 보낸닀. 첫 번째 λ°μ΄ν„°κ·Έλž¨μ˜ λ‚΄μš©μ€ 두 λ²„νΌμ—μ„œ 온 것이닀.

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

int
main(void)
{
    int sockfd;
    struct sockaddr_in addr;
    struct mmsghdr msg[2];
    struct iovec msg1[2], msg2;
    int retval;

    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 (connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
        perror("connect()");
        exit(EXIT_FAILURE);
    }

    memset(msg1, 0, sizeof(msg1));
    msg1[0].iov_base = "one";
    msg1[0].iov_len = 3;
    msg1[1].iov_base = "two";
    msg1[1].iov_len = 3;

    memset(&msg2, 0, sizeof(msg2));
    msg2.iov_base = "three";
    msg2.iov_len = 5;

    memset(msg, 0, sizeof(msg));
    msg[0].msg_hdr.msg_iov = msg1;
    msg[0].msg_hdr.msg_iovlen = 2;

    msg[1].msg_hdr.msg_iov = &msg2;
    msg[1].msg_hdr.msg_iovlen = 1;

    retval = sendmmsg(sockfd, msg, 2, 0);
    if (retval == -1)
        perror("sendmmsg()");
    else
        printf("%d messages sent\n", retval);

    exit(0);
}

SEE ALSO

recvmmsg(2), sendmsg(2), socket(2), socket(7)


2019-03-06

⚠️ **GitHub.com Fallback** ⚠️