Man page - sendmmsg(2)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

SENDMMSG

名 前
書 式
説 明
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意
バ グ

関 連 項 目
こ の 文 書 に つ い て

名 前

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) と 同 じ で あ る 。

停 止 (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) で あ る 。

バ グ

If an error occurs after at least one message has been sent, the call succeeds, and returns the number of messages sent. The error code is lost. The caller can retry the transmission, starting at the first failed message, but there is no guarantee that, if an error is returned, it will be the same as the one that was lost on the previous call.

以 下 の 例 で は 、 sendmmsg () を 使 っ て 、 一 度 の シ ス テ ム コ ー ル で 、 onetwo three を 二 つ の 別 々 の 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 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)

こ の 文 書 に つ い て

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