.\" Copyright (c) 1983, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" From: @(#)send.2 8.2 (Berkeley) 2/21/94 .\" %FreeBSD: src/lib/libc/sys/send.2,v 1.27.2.1 2005/01/31 00:27:01 keramida Exp % .\" .\" $FreeBSD$ .Dd February 15, 1995 .Dt SEND 2 .Os .Sh 名称 .Nm send , .Nm sendto , .Nm sendmsg .Nd ソケットからメッセージを送信する .Sh ライブラリ .Lb libc .Sh 書式 .In sys/types.h .In sys/socket.h .Ft ssize_t .Fn send "int s" "const void *msg" "size_t len" "int flags" .Ft ssize_t .Fn sendto "int s" "const void *msg" "size_t len" "int flags" "const struct sockaddr *to" "socklen_t tolen" .Ft ssize_t .Fn sendmsg "int s" "const struct msghdr *msg" "int flags" .Sh 解説 .Fn send 関数および .Fn sendto システムコールおよび .Fn sendmsg システムコールは、メッセージを別のソケットに送信するのに使用されます。 .Fn send 関数は、ソケットが .Em 接続された 状態にあるときにだけ使用できるのに対し、 .Fn sendto と .Fn sendmsg はいつでも使用できます。 .Pp ターゲットのアドレスを .Fa to で与え、 .Fa tolen でそのサイズを指定します。 メッセージの長さは .Fa len で指定します。 メッセージが長すぎて基層となるプロトコルを不可分に通過できない場合、 エラー .Er EMSGSIZE を返し、メッセージを送信しません。 .Pp .Fn send では、配送できないことはまったく示されません。 戻り値 -1 はローカルで検出されたエラーを示します。 .Pp 送信するメッセージを保持するスペースがソケットに無い場合 .Fn send は通常ブロックします。 ただし、ソケットが非ブロッキング入出力モードに設定されている場合は別です。 .Xr select 2 システムコールを使用して、さらに多くのデータをいつ送信できるか判定できます。 .Pp .Fa flags 引数には次に示されるもののうち 1 つまたは複数を含めることが可能です: .Bd -literal #define MSG_OOB 0x1 /* 帯域外データを処理する */ #define MSG_PEEK 0x2 /* 着信メッセージを覗く */ #define MSG_DONTROUTE 0x4 /* ルーティングをバイパスし、 インタフェースを直接使用する */ #define MSG_EOR 0x8 /* このデータでレコードを終了する */ #define MSG_EOF 0x100 /* このデータでトランザクションを終了する */ .Ed .Pp フラグ .Dv MSG_OOB は、この概念をサポートするソケット (たとえば、 .Dv SOCK_STREAM ) 上の .Dq 帯域外 データを送信するのに使用されます。 基層となっているプロトコルも .Dq 帯域外 データをサポートする必要があります。 .Dv MSG_EOR は、この概念をサポートするプロトコル用のレコードマークを示すのに使用されます。 .Dv MSG_EOF は、ソケットの送信側のシャットダウンを要求し、 指定データの終了時に、適切な指示の送信を要求します。 このフラグは、 .Dv PF_INET プロトコルファミリの .Dv SOCK_STREAM ソケットについてだけ実装され、トランザクション .Tn TCP .Xr ( ttcp 4 を参照) を実装するのに使用されます。 .Dv MSG_DONTROUTE は通常、診断プログラムまたは経路設定プログラムで使用されます。 .Pp .Fa msghdr 構造体の詳細については、 .Xr recv 2 を参照してください。 .Sh 戻り値 この呼び出しは送信された文字数を返し、エラーが起きた場合は -1 を返します。 .Sh エラー .Fn send 関数および .Fn sendto システムコールおよび .Fn sendmsg システムコールは次の場合に実行に失敗します: .Bl -tag -width Er .It Bq Er EBADF 無効な記述子が指定されました。 .It Bq Er EACCES 宛先アドレスはブロードキャストアドレスであり、 .Dv SO_BROADCAST がソケット上に設定されていません。 .It Bq Er ENOTSOCK 引数 .Fa s がソケットではありません。 .It Bq Er EFAULT 引数について無効なユーザ空間アドレスが指定されました。 .It Bq Er EMSGSIZE ソケットはメッセージが不可分に送信されることを要求していますが、 送信されるメッセージのサイズでは不可能です。 .It Bq Er EAGAIN ソケットは非ブロッキングとマークされており、 要求された操作はブロックされるでしょう。 .It Bq Er ENOBUFS システムは内部バッファを割り当てることができませんでした。 バッファが利用可能になったときに操作が成功する可能性があります。 .It Bq Er ENOBUFS ネットワークインタフェース用の出力キューが満杯でした。 これは一般に、インタフェースが送信を停止したものの、 それが一時的な輻輳によって起こったことを示します。 .It Bq Er EHOSTUNREACH リモートホストに到達できませんでした。 .It Bq Er EISCONN 宛先アドレスが指定され、そしてソケットは既に接続されています。 .It Bq Er ECONNREFUSED ソケットが、ICMP 宛先不到達メッセージを、 最後に送信したメッセージから受信しました。 典型的には、受信者がリモートポートで待機していないことを意味します。 .It Bq Er EHOSTDOWN リモートホストがダウンしていました。 .It Bq Er ENETDOWN リモートネットワークがダウンしていました。 .It Bq Er EPERM .Dv SOCK_RAW ソケットを使用しているプロセスが jail の中にあり、IP ヘッダの 中で指定されている送信元のアドレスが、その捕虜プロセスに 結び付けられている IP アドレスと一致しませんでした。 .It Bq Er EPIPE ソケットがこれ以上データを送信できません .Dv ( SBS_CANTSENDMORE がそのソケットに設定されています)。 これは通常、そのソケットが接続されていないことを意味します。 .El .Sh バグ .Fn sendmsg はデータが転送されてしまうまで必ずしもブロックしないので、 オープンされているファイル記述子を .Dv AF_UNIX ドメインソケット .Xr ( recv 2 を参照) 経由で送信し、それから実際に送信される前に .Fn close する可能性があります。 その結果、受信側は閉じたファイル記述子を得ることになります。 これを防止する確認メカニズムの実装は、 アプリケーションで行う必要があります。 .Sh 関連項目 .Xr fcntl 2 , .Xr getsockopt 2 , .Xr recv 2 , .Xr select 2 , .Xr socket 2 , .Xr write 2 .Sh 歴史 .Fn send 関数は .Bx 4.2 で登場しました。