Manpages

名 前

sendmmsg − 複 数 の メ ッ セ ー ジ を ソ ケ ッ ト へ 送 信 す る

書 式

#define _GNU_SOURCE /* feature_test_macros(7) 参 照 */
#include <sys/socket.h>

int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned 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) と 同 じ で あ る 。 停 止 (blocking) モ ー ド の sendmmsg() の 呼 び 出 し は 、 vlen 個 の メ ッ セ ー ジ が 送 信 さ れ る ま で 停 止 す る 。 非 停 止 (nonblocking) モ ー ド の 呼 び 出 し で は 、 送 信 で き る だ け の メ ッ セ ー ジ (最 大 で vlen 個 ) を 送 信 し 、 す ぐ に 返 る 。

sendmmsg() が 返 っ た 際 に は 、 msgvec の 送 信 が 行 わ れ た 要 素 の msg_len フ ィ ー ル ド は 、 対 応 す る msg_hdr か ら 送 信 さ れ た バ イ ト 数 が 入 っ て い る 。 呼 び 出 し の 返 り 値 は 、 更 新 さ れ た msgvec の 要 素 数 で あ る 。

返 り 値

成 功 す る と 、 sendmmsg() は msgvec か ら 送 信 さ れ た メ ッ セ ー ジ 数 を 返 す 。 返 り 値 が vlen よ り も 小 さ い 場 合 、 呼 び 出 し た 側 で は 再 度 sendmmsg を 呼 び 出 し て 残 り の メ ッ セ ー ジ を 送 信 す る こ と が で き る 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。

エ ラ ー

エ ラ ー は sendmsg(2) と 同 じ で あ る 。 エ ラ ー が 返 さ れ る の は 、 デ ー タ グ ラ ム が 全 く 送 信 で き な か っ た 場 合 の み で あ る 。

バ ー ジ ョ ン

sendmmsg() シ ス テ ム コ ー ル は Linux 3.0 で 追 加 さ れ た 。 glibc で の サ ポ ー ト は バ ー ジ ョ ン 2.14 で 追 加 さ れ た 。

準 拠

sendmmsg() は Linux 固 有 で あ る 。

注 意

vlen に 指 定 で き る 値 の 最 大 値 は UIO_MAXIOV (1024) で あ る 。

以 下 の 例 で は 、 sendmmsg() を 使 っ て 、 一 度 の シ ス テ ム コ ー ル で 、 onetwothree を 二 つ の 別 々 の UDP デ ー タ グ ラ ム で 送 信 す る 。 一 つ 目 の デ ー タ グ ラ ム の 内 容 は 、 二 つ の バ ッ フ ァ ー か ら 取 得 さ れ る 。

#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 sa;
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); }

sa.sin_family = AF_INET;
sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
sa.sin_port = htons(1234);
if (connect(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == −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)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。