sendmmsg(2) - wariua/manpages-ko GitHub Wiki
sendmmsg - μμΌμΌλ‘ μ¬λ¬ λ©μμ§ λ³΄λ΄κΈ°
#define _GNU_SOURCE /* feature_test_macros(7) μ°Έκ³ */
#include <sys/socket.h>
int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
int flags);
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
νλͺ© κ°μλ₯Ό λνλΈλ€.
μ±κ³΅ μ sendmmsg()
λ msgvec
μμ λ³΄λΈ λ©μμ§ κ°μλ₯Ό λ°ννλ€. κ·Έ κ°μ΄ vlen
λ³΄λ€ μμ κ²½μ° νΈμΆμκ° sendmmsg()
λ₯Ό μΆκ°λ‘ νΈμΆν΄μ λλ¨Έμ§ λ©μμ§λ€μ 보λ΄λ € ν μ μλ€.
μ€λ₯ μ -1μ λ°ννλ©° μ€λ₯λ₯Ό λνλ΄λλ‘ errno
λ₯Ό μ€μ νλ€.
μ€λ₯λ€μ΄ sendmsg(2)μμμ κ°λ€. μ΄λ€ λ°μ΄ν°κ·Έλ¨λ λ³΄λΌ μ μμλ κ²½μ°μλ§ μ€λ₯λ₯Ό λ°ννλ€. BUGSλ μ°Έκ³ .
리λ
μ€ 3.0μμ sendmmsg()
μμ€ν
νΈμΆμ΄ μΆκ°λμλ€. glibc λ²μ 2.14μμ μ§μμ΄ μΆκ°λμλ€.
sendmmsg()
λ 리λ
μ€ μ μ©μ΄λ€.
vlen
μ μ§μ ν μ μλ κ°μ νλκ° UIO_MAXIOV
(1024)μ΄λ€.
μ΅μ ν κ° λ©μμ§λ₯Ό λ³΄λΈ νμ μ€λ₯κ° λ°μνλ©΄ νΈμΆμ΄ μ±κ³΅νκ³ λ³΄λΈ λ©μμ§ μλ₯Ό λ°ννλ€. μ€λ₯ μ½λλ μ μ€λλ€. νΈμΆμκ° μ€ν¨ν 첫 λ²μ§Έ λ©μμ§λΆν° μ μ‘μ μ¬μλν μ μμ§λ§ κ·Έλ μ€λ Ή μ€λ₯κ° λ°μνλ€κ³ ν΄λ κ·Έκ² μ΄μ νΈμΆμμ μ μ€λ κ²κ³Ό κ°μ μ€λ₯λΌλ 보μ₯μ΄ μλ€.
μλ μμμλ 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);
}
recvmmsg(2), sendmsg(2), socket(2), socket(7)
2019-03-06