Manpages

名 前

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_addraddrlen は 無 視 さ れ る (各 々 の 引 き 数 が 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 モ ー ド で な い 場 合 )。 非 停 止 モ ー ド の 場 合 に は エ ラ ー EAGAINEWOULDBLOCK で 失 敗 す る 。 い つ デ ー タ を さ ら に 送 信 で き る よ う に な る か を 知 る た め に 、 select(2) コ ー ル を 使 用 す る こ と が で き る 。 フ ラ グ 引 き 数
flags
引 き 数 は 、 以 下 の フ ラ グ の (0 個 以 上 の ) ビ ッ ト 単 位 の 論 理 和 を と っ た も の を 指 定 す る 。
MSG_CONFIRM
(Linux 2.3.15 以 降 ) 転 送 処 理 に 進 展 が あ っ た 、 つ ま り 相 手 側 か ら 成 功 の 応 答 を 受 け た こ と を リ ン ク 層 に 知 ら せ る 。 リ ン ク 層 が こ の 通 知 を 受 け 取 ら な か っ た 場 合 に は 、 通 常 ど お り (ユ ニ キ ャ ス ト ARP を 使 う な ど の 方 法 で ) 近 傍 (neighbor) の 再 検 索 を 行 う 。 SOCK_DGRAMSOCK_RAW の ソ ケ ッ ト に 対 し て の み 有 効 で 、 現 在 の と こ ろ IPv4 と IPv6 の み 実 装 さ れ て い る 。 詳 し く は arp(7) 参 照 の こ と 。
MSG_DONTROUTE
パ ケ ッ ト を 送 り 出 す の に ゲ ー ト ウ ェ イ を 使 用 せ ず 、 直 接 接 続 さ れ て い る ネ ッ ト ワ ー ク 上 の ホ ス ト だ け に 送 る 。 通 常 、 こ の フ ラ グ は 診 断 (diagnostic) や ル ー テ ィ ン グ プ ロ グ ラ ム に よ っ て の み 使 用 さ れ る 。 こ の フ ラ グ は 、 経 路 制 御 が 行 わ れ る プ ロ ト コ ル フ ァ ミ リ ー に 対 し て の み 定 義 さ れ て い る 。 パ ケ ッ ト ソ ケ ッ ト に は 定 義 さ れ て い な い 。
MSG_DONTWAIT
(Linux 2.2 以 降 ) 非 停 止 (nonblocking) 操 作 を 有 効 に す る 。 操 作 が 停 止 さ れ る よ う な 場 合 に は EAGAINEWOULDBLOCK を 返 す よ う に す る (fcntl(2) の F_SETFLO_NONBLOCK フ ラ グ を 指 定 す る こ と に よ っ て も 有 効 に で き る )。
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 以 降 ) ス ト リ ー ム 指 向 の ソ ケ ッ ト で 相 手 側 が 接 続 を 切 断 し た 時 に 、 エ ラ ー と し て SIGPIPE を 送 信 し な い よ う に 要 求 す る 。 こ の 場 合 で も EPIPE は 返 さ れ る 。
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_iovmsg_iovlen は scatter−gather 用 の 場 所 を 指 定 す る 。 writev(2) と 同 じ 。 フ ィ ー ル ド msg_controlmsg_controllen を 使 用 し て 制 御 情 報 を 送 信 す る こ と が で き る 。 カ ー ネ ル が 処 理 で き る 制 御 バ ッ フ ァ ー の ソ ケ ッ ト あ た り の 最 大 長 は 、 /proc/sys/net/core/optmem_max の 値 に 制 限 さ れ て い る 。 socket(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 の 議 論 を 参 照 の こ と 。

EBADF

無 効 な デ ィ ス ク リ プ タ ー が 指 定 さ れ た 。

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_OOBMSG_EOR フ ラ グ だ け が 記 載 さ れ て い る 。 POSIX.1−2008 で は MSG_NOSIGNAL が 規 格 に 追 加 さ れ て い る 。 MSG_CONFIRM フ ラ グ は Linux で の 拡 張 で あ る 。

注 意

POSIX.1−2001 で は 、 構 造 体 msghdr の フ ィ ー ル ド msg_controllensocklen_t 型 で あ る べ き だ と さ れ て い る が 、 現 在 の glibc で は 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), socket(7), tcp(7), udp(7)

こ の 文 書 に つ い て

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