Man page - sendmsg(2)

Packages contains this manual

Available languages:

en fr tr ja ru

Manual

SEND

名 前
書 式
説 明
フ ラ グ 引 数
sendmsg()
返 り 値
エ ラ ー
準 拠
注 意
バ グ

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

名 前

send, sendto, sendmsg - ソ ケ ッ ト へ メ ッ セ ー ジ を 送 る

書 式

#include <sys/types.h>
#include <sys/socket.h>

ssize_t send(int sockfd , const void * buf , size_t len , int flags );

ssize_t sendto(int sockfd , const void * buf , size_t len , int flags ,
const struct sockaddr *
dest_addr , socklen_t addrlen );

ssize_t sendmsg(int sockfd , const struct msghdr * msg , int flags );

説 明

シ ス テ ム コ ー ル send (), sendto (), sendmsg () は 、 も う 一 方 の ソ ケ ッ ト へ メ ッ セ ー ジ を 転 送 す る の に 使 用 さ れ る 。

send () は 、 ソ ケ ッ ト が 接 続 さ れ た (connected) 状 態 に あ る 場 合 に の み 使 用 で き る (つ ま り 、 ど の 相 手 に 送 信 す る か は 既 知 で あ る )。 send () と write (2) の 違 い は 、 引 数 に flags が あ る か ど う か だ け で あ る 。 引 数 flags に フ ラ グ が 指 定 さ れ な い 場 合 、 send () は write (2) と 等 価 で あ る 。 ま た 、

send(sockfd, buf, len, flags);

は 以 下 と 等 価 で あ る 。

sendto(sockfd, buf, len, flags, NULL, 0);

引 数 sockfd は 、 デ ー タ を 送 信 す る パ ケ ッ ト の フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。

sendto () は 、 接 続 型 (connection-mode) の ソ ケ ッ ト ( SOCK_STREAM , SOCK_SEQPACKET ) で 使 用 さ れ た 場 合 、 引 数 dest_addr addrlen は 無 視 さ れ る (各 々 の 引 数 が NULL と 0 で な い 場 合 は EISCONN エ ラ ー も 返 さ れ る )。 ま た 、 ソ ケ ッ ト が 実 際 に は 接 続 さ れ て い な か っ た 時 に は ENOTCONN エ ラ ー が 返 さ れ る 。 接 続 型 の ソ ケ ッ ト 以 外 で 使 用 さ れ た 場 合 は 、 接 続 先 の ア ド レ ス は dest_addr で 与 え ら れ 、 そ の サ イ ズ は addrlen で 指 定 さ れ る 。 sendmsg () で は 、 接 続 先 の ア ド レ ス は msg.msg_name で 与 え ら れ 、 そ の サ イ ズ は msg.msg_namelen で 指 定 さ れ る 。

send () と sendto () で は 、 メ ッ セ ー ジ は buf に 格 納 さ れ て お り 、 そ の 長 さ は len で あ る と 解 釈 さ れ る 。 sendmsg () で は 、 メ ッ セ ー ジ は 配 列 msg.msg_iov の 各 要 素 が 指 す 位 置 に 格 納 さ れ て い る 。 sendmsg () で は 、 補 助 デ ー タ (制 御 情 報 と も 呼 ば れ る ) を 送 信 す る こ と も で き る 。

メ ッ セ ー ジ 長 が 長 過 ぎ る た め に 、 そ の ソ ケ ッ ト が 使 用 す る プ ロ ト コ ル で は 、 メ ッ セ ー ジ を ソ ケ ッ ト に 渡 さ れ た ま ま の 形 で 送 信 す る こ と が で き な い 場 合 、 EMSGSIZE エ ラ ー が 返 さ れ 、 そ の メ ッ セ ー ジ は 転 送 さ れ な い 。

send () で は 、 配 送 の 失 敗 の 通 知 は 明 示 的 に 行 わ れ る 。 ロ ー カ ル 側 で エ ラ ー が 検 出 さ れ た 場 合 は 、 返 り 値 -1 と し て 通 知 さ れ る 。

メ ッ セ ー ジ が ソ ケ ッ ト の 送 信 バ ッ フ ァ ー に 入 れ る こ と が で き な い 場 合 、 send () は 通 常 は 停 止 (block) す る (ソ ケ ッ ト が 非 停 止 (nonblocking) I/O モ ー ド で な い 場 合 )。 非 停 止 モ ー ド の 場 合 に は エ ラ ー EAGAIN EWOULDBLOCK で 失 敗 す る 。 い つ デ ー タ を さ ら に 送 信 で き る よ う に な る か を 知 る た め に 、 select (2) コ ー ル を 使 用 す る こ と が で き る 。

フ ラ グ 引 数

flags 引 数 は 、 以 下 の フ ラ グ の (0 個 以 上 の ) ビ ッ ト 単 位 の 論 理 和 を と っ た も の を 指 定 す る 。
MSG_CONFIRM
(Linux 2.3.15 以 降 )

転 送 処 理 に 進 展 が あ っ た 、 つ ま り 相 手 側 か ら 成 功 の 応 答 を 受 け た こ と を リ ン ク 層 に 知 ら せ る 。 リ ン ク 層 が こ の 通 知 を 受 け 取 ら な か っ た 場 合 に は 、 通 常 ど お り (ユ ニ キ ャ ス ト ARP を 使 う な ど の 方 法 で ) 近 傍 (neighbor) の 再 検 索 を 行 う 。 SOCK_DGRAM SOCK_RAW の ソ ケ ッ ト に 対 し て の み 有 効 で 、 現 在 の と こ ろ IPv4 と IPv6 の み 実 装 さ れ て い る 。 詳 し く は arp (7) 参 照 の こ と 。

MSG_DONTROUTE

パ ケ ッ ト を 送 り 出 す の に ゲ ー ト ウ ェ イ を 使 用 せ ず 、 直 接 接 続 さ れ て い る ネ ッ ト ワ ー ク 上 の ホ ス ト だ け に 送 る 。 通 常 、 こ の フ ラ グ は 診 断 (diagnostic) や ル ー テ ィ ン グ プ ロ グ ラ ム に よ っ て の み 使 用 さ れ る 。 こ の フ ラ グ は 、 経 路 制 御 が 行 わ れ る プ ロ ト コ ル フ ァ ミ リ ー に 対 し て の み 定 義 さ れ て い る 。 パ ケ ッ ト ソ ケ ッ ト に は 定 義 さ れ て い な い 。

MSG_DONTWAIT (Linux 2.2 以 降 )

Enables nonblocking operation; if the operation would block, EAGAIN or EWOULDBLOCK is returned. This provides similar behavior to setting the O_NONBLOCK flag (via the fcntl (2) F_SETFL operation), but differs in that MSG_DONTWAIT is a per-call option, whereas O_NONBLOCK is a setting on the open file description (see open (2)), which will affect all threads in the calling process and as well as other processes that hold file descriptors referring to the same open file description.

MSG_EOR (Linux 2.2 以 降 )

レ コ ー ド の 終 了 を 指 示 す る ( SOCK_SEQPACKET の よ う に こ の 概 念 に 対 応 し て い る ソ ケ ッ ト 種 別 の と き に 有 効 )。

MSG_MORE (Linux 2.4.4 以 降 )

呼 び 出 し 元 に さ ら に 送 る デ ー タ が あ る こ と を 示 す 。 こ の フ ラ グ は TCP ソ ケ ッ ト と と も に 使 用 さ れ 、 TCP_CORK ソ ケ ッ ト オ プ シ ョ ン と 同 じ 効 果 が 得 ら れ る ( tcp (7) を 参 照 )。 TCP_CORK と の 違 い は 、 こ の フ ラ グ を 使 う と 呼 び 出 し 単 位 で こ の 機 能 を 有 効 に で き る 点 で あ る 。

Linux 2.6 以 降 で は 、 こ の フ ラ グ は UDP ソ ケ ッ ト で も サ ポ ー ト さ れ て お り 、 こ の フ ラ グ 付 き で 送 信 さ れ た 全 て の デ ー タ を 一 つ の デ ー タ グ ラ ム に ま と め て 送 信 す る こ と を 、 カ ー ネ ル に 知 ら せ る 。 ま と め ら れ た デ ー タ グ ラ ム は 、 こ の フ ラ グ を 指 定 せ ず に こ の シ ス テ ム コ ー ル が 実 行 さ れ た 際 に 初 め て 送 信 さ れ る ( udp (7) に 記 載 さ れ て い る ソ ケ ッ ト オ プ シ ョ ン UDP_CORK も 参 照 )。

MSG_NOSIGNAL (Linux 2.2 以 降 )

Don’t generate a SIGPIPE signal if the peer on a stream-oriented socket has closed the connection. The EPIPE error is still returned. This provides similar behavior to using sigaction (2) to ignore SIGPIPE , but, whereas MSG_NOSIGNAL is a per-call feature, ignoring SIGPIPE sets a process attribute that affects all threads in the process.

MSG_OOB

帯 域 外 (out-of-band) デ ー タ を サ ポ ー ト す る ソ ケ ッ ト (例 え ば SOCK_STREAM ) で 帯 域 外 デ ー タ を 送 る 。 下 位 プ ロ ト コ ル も 帯 域 外 デ ー タ を サ ポ ー ト し て い る 必 要 が あ る 。

sendmsg()

sendmsg () で 利 用 さ れ て い る msghdr 構 造 体 は 以 下 の 通 り 。

struct msghdr {
void *msg_name; /* 追 加 の ア ド レ ス */
socklen_t msg_namelen; /* ア ド レ ス の サ イ ズ */
struct iovec *msg_iov; /* scatter/gather 配 列 */
size_t msg_iovlen; /* msg_iov の 要 素 数 */
void *msg_control; /* 補 助 デ ー タ (後 述 ) */
size_t msg_controllen; /* 補 助 デ ー タ バ ッ フ ァ ー 長 */
int msg_flags; /* フ ラ グ (未 使 用 ) */
};

フ ィ ー ル ド msg_name は 、 未 接 続 の ソ ケ ッ ト で デ ー タ グ ラ ム の 宛 先 ア ド レ ス を 指 定 す る の に 使 用 さ れ る 。 こ の フ ィ ー ル ド は ア ド レ ス を 格 納 し た バ ッ フ ァ ー を 指 す 。 フ ィ ー ル ド msg_namelen に は ア ド レ ス の 大 き さ を 設 定 し な け れ ば な ら な い 。 接 続 済 の ソ ケ ッ ト に つ い て は 、 こ れ ら の フ ィ ー ル ド に は そ れ ぞ れ NULL と 0 を 指 定 し な け れ ば な ら な い 。

フ ィ ー ル ド msg_iov msg_iovlen は scatter-gather 用 の 場 所 を 指 定 す る 。 writev (2) と 同 じ 。

You may send control information (ancillary data) using the msg_control and msg_controllen members. The maximum control buffer length the kernel can process is limited per socket by the value in /proc/sys/net/core/optmem_max ; see socket (7). For further information on the use of ancillary data in various socket domains, see unix (7) and ip (7).

フ ィ ー ル ド msg_flags は 無 視 さ れ る 。

返 り 値

成 功 し た 場 合 、 こ れ ら の シ ス テ ム コ ー ル は 送 信 さ れ た バ イ ト 数 を 返 す 。 エ ラ ー の 場 合 、 -1 を 返 し 、 errno を 適 切 に 設 定 に す る 。

エ ラ ー

こ れ ら は ソ ケ ッ ト 層 で 発 生 す る 一 般 的 な エ ラ ー で あ る 。 こ れ 以 外 に 、 下 層 の プ ロ ト コ ル モ ジ ュ ー ル で 生 成 さ れ た エ ラ ー が 返 さ れ る か も し れ な い 。 こ れ ら に つ い て は 、 そ れ ぞ れ の マ ニ ュ ア ル を 参 照 す る こ と 。

EACCES

(UNIX ド メ イ ン ソ ケ ッ ト の 場 合 ; パ ス 名 で 識 別 さ れ る 。 )

ソ ケ ッ ト フ ァ イ ル へ の 書 き 込 み 許 可 が な か っ た か 、 パ ス 名 へ 到 達 す る ま で の デ ィ レ ク ト リ の い ず れ か に 対 す る 検 索 許 可 が な か っ た 。 ( path_resolution (7) も 参 照 の こ と )

(UDP ソ ケ ッ ト の 場 合 ) ユ ニ キ ャ ス ト ア ド レ ス で あ る か の よ う に 、 ネ ッ ト ワ ー ク ア ド レ ス や ブ ロ ー ド キ ャ ス ト ア ド レ ス へ の 送 信 が 試 み ら れ た 。

EAGAIN ま た は EWOULDBLOCK

ソ ケ ッ ト が 非 停 止 に 設 定 さ れ て お り 、 要 求 さ れ た 操 作 が 停 止 し た 。 POSIX.1-2001 は 、 こ の 場 合 に ど ち ら の エ ラ ー を 返 す こ と も 認 め て お り 、 こ れ ら 2 つ の 定 数 が 同 じ 値 を 持 つ こ と も 求 め て い な い 。 し た が っ て 、 移 植 性 が 必 要 な ア プ リ ケ ー シ ョ ン で は 、 両 方 の 可 能 性 を 確 認 す べ き で あ る 。

EAGAIN

(イ ン タ ー ネ ッ ト ド メ イ ン デ ー タ グ ラ ム ソ ケ ッ ト の 場 合 ) sockfd が 参 照 す る ソ ケ ッ ト が そ れ 以 前 に ア ド レ ス に バ イ ン ド さ れ て お ら ず 、 そ の ソ ケ ッ ト に 一 時 ポ ー ト を バ イ ン ド し よ う と し た 際 に 、 一 時 ポ ー ト と し て 使 用 す る 範 囲 の ポ ー ト 番 号 が す べ て 使 用 中 で あ っ た 。 ip (7) の /proc/sys/net/ipv4/ip_local_port_range の 議 論 を 参 照 の こ と 。

EALREADY

Another Fast Open is in progress.

EBADF

sockfd が 有 効 な オ ー プ ン さ れ た フ ァ イ ル デ ィ ス ク リ プ タ ー で な い 。

ECONNRESET

接 続 が 接 続 相 手 に よ り リ セ ッ ト さ れ た 。

EDESTADDRREQ

ソ ケ ッ ト が 接 続 型 (connection-mode) で は な く 、 か つ 送 信 先 の ア ド レ ス が 設 定 さ れ て い な い 。

EFAULT

ユ ー ザ ー 空 間 と し て 不 正 な ア ド レ ス が パ ラ メ ー タ ー と し て 指 定 さ れ た 。

EINTR

デ ー タ が 送 信 さ れ る 前 に 、 シ グ ナ ル が 発 生 し た 。 signal (7) 参 照 。

EINVAL

不 正 な 引 数 が 渡 さ れ た 。

EISCONN

接 続 型 ソ ケ ッ ト の 接 続 が す で に 確 立 し て い た が 、 受 信 者 が 指 定 さ れ て い た 。 (現 在 の と こ ろ 、 こ の 状 況 で は 、 こ の エ ラ ー が 返 さ れ る か 、 受 信 者 の 指 定 が 無 視 さ れ る か 、 の い ず れ か と な る )

EMSGSIZE

そ の ソ ケ ッ ト 種 別 で は ソ ケ ッ ト に 渡 さ れ た ま ま の 形 で メ ッ セ ー ジ を 送 信 す る 必 要 が あ る が 、 メ ッ セ ー ジ が 大 き 過 ぎ る た め 送 信 す る こ と が で き な い 。

ENOBUFS

ネ ッ ト ワ ー ク イ ン タ ー フ ェ ー ス の 出 力 キ ュ ー が 一 杯 で あ る 。 一 般 的 に は 、 一 時 的 な 輻 輳 (congestion) の た め に イ ン タ ー フ ェ ー ス が 送 信 を 止 め て い る こ と を 意 味 す る 。 (通 常 、 Linux で は こ の よ う な こ と は 起 こ ら な い 。 デ バ イ ス の キ ュ ー が オ ー バ ー フ ロ ー し た 場 合 に は パ ケ ッ ト は 黙 っ て 捨 て ら れ る )

ENOMEM

メ モ リ ー が 足 り な い 。

ENOTCONN

ソ ケ ッ ト が 接 続 さ れ て お ら ず 、 接 続 先 も 指 定 さ れ て い な い 。

ENOTSOCK

フ ァ イ ル デ ィ ス ク リ プ タ ー sockfd が ソ ケ ッ ト を 参 照 し て い な い 。

EOPNOTSUPP

引 数 flags の い く つ か の ビ ッ ト が 、 そ の ソ ケ ッ ト 種 別 で は 不 適 切 な も の で あ る 。

EPIPE

接 続 指 向 の ソ ケ ッ ト で ロ ー カ ル 側 が 閉 じ ら れ て い る 。 こ の 場 合 、 MSG_NOSIGNAL が 設 定 さ れ て い な け れ ば 、 プ ロ セ ス に は SIGPIPE も 同 時 に 送 ら れ る 。

準 拠

4.4BSD, SVr4, POSIX.1-2001. (こ れ ら の イ ン タ ー フ ェ ー ス は 4.2BSD で 最 初 に 登 場 し た )。

POSIX.1-2001 に は 、 MSG_OOB MSG_EOR フ ラ グ だ け が 記 載 さ れ て い る 。 POSIX.1-2008 で は MSG_NOSIGNAL が 規 格 に 追 加 さ れ て い る 。 MSG_CONFIRM フ ラ グ は Linux で の 拡 張 で あ る 。

注 意

According to POSIX.1-2001, the msg_controllen field of the msghdr structure should be typed as socklen_t , and the msg_iovlen field should be typed as int , but glibc currently types both as size_t .

sendmmsg (2) に は 、 一 度 の 呼 び 出 し で の 複 数 の デ ー タ グ ラ ム の 送 信 に 使 用 で き る Linux 固 有 の シ ス テ ム コ ー ル に 関 す る 情 報 が 書 か れ て い る 。

バ グ

Linux は ENOTCONN を 返 す 状 況 で EPIPE を 返 す こ と が あ る 。

sendto () の 利 用 例 が getaddrinfo (3) に 記 載 さ れ て い る 。

関 連 項 目

fcntl (2), getsockopt (2), recv (2), select (2), sendfile (2), sendmmsg (2), shutdown (2), socket (2), write (2), cmsg (3), ip (7), ipv6 (7), socket (7), tcp (7), udp (7), unix (7)

こ の 文 書 に つ い て

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