Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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 以降)
              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_iovmsg_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_OOBMSG_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/ に書かれている。