名 前
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 以 降 ) 非
停 止 (nonblocking) 操 作 を
有 効 に す る 。
操 作 が 停 止 さ
れ る よ う な 場
合 に は EAGAIN か
EWOULDBLOCK を 返 す よ
う に す る (fcntl(2)
の F_SETFL で O_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_iov と msg_iovlen は
scatter−gather 用 の 場 所
を 指 定 す る 。
writev(2) と 同 じ 。
フ ィ ー ル ド
msg_control と msg_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_OOB と MSG_EOR フ ラ グ だ け が 記 載 さ れ て い る 。 POSIX.1−2008 で は MSG_NOSIGNAL が 規 格 に 追 加 さ れ て い る 。 MSG_CONFIRM フ ラ グ は Linux で の 拡 張 で あ る 。
注 意
POSIX.1−2001 で は 、 構 造 体 msghdr の フ ィ ー ル ド msg_controllen は socklen_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/ に 書 か れ て い る 。