Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all
名前
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/ に書かれている。