Provided by: manpages-ja-dev_0.5.0.0.20131015+dfsg-2_all ![bug](/img/bug.png)
![bug](/img/bug.png)
名前
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) で 帯域外 データを送る。下 位プロトコルも 帯域外 データをサポートしている必要がある。 msghdr 構造体の内容は以下の通り。 各フィールドの正確な記述については recv(2) と以下の説明を参照するこ と。 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_control と msg_controllen メンバーを使用して制御情報を送信することができる。 カーネルが処理できる制御 バッファのソケットあたりの最大長は、 /proc/sys/net/core/optmem_max の値に制限されている。 socket(7) を参 照。
返り値
成功した場合、これらのシステムコールは送信されたバイト数を返す。 エラーの場合、 -1 を返し、 errno を適切 に設定にする。
エラー
これらはソケット層で発生する一般的なエラーである。これ以外に、下層の プロトコル・モジュールで生成されたエ ラーが返されるかもしれない。 これらについては、それぞれのマニュアルを参照すること。 EACCES (UNIX ドメインソケットの場合; パス名で識別される。) ソケット・ファイルへの書き込み許可がなかったか、パス名へ到達するまでの ディレクトリのいずれかに対 する検索許可がなかった。 (path_resolution(7) も参照のこと) (UDP ソケットの場合) ユニキャストアドレスであるかのように、 ネットワークアドレスやブロードキャスト アドレスへの送信が試みられた。 EAGAIN または EWOULDBLOCK ソケットが非停止に設定されており、 要求された操作が停止した。 POSIX.1-2001 は、この場合にどちらの エラーを返すことも認めており、 これら 2 つの定数が同じ値を持つことも求めていない。 したがって、移 植性が必要なアプリケーションでは、両方の可能性を 確認すべきである。 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 での拡張である。
注意
上記のプロトタイプは Single UNIX Specification に従っている。 glibc2 も同様である。 flags 引き数は 4.x BSD では int であり、 libc4 と libc5 では unsigned int である。 len 引き数は 4.x BSD と libc4 では int で あり、 libc5 では size_t である。 addrlen 引き数は 4.x BSD と libc4 と libc5 では int である。 accept(2) も参照すること。 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.54 の一部 である。プロジェクトの説明とバグ報告 に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。