send(2) FreeBSD 一般コマンドマニュアル

send

前のページ 上に戻る 次のページ

send




書式

     #include <sys/types.h>
     #include <sys/socket.h>

     ssize_t
     send(int s, const void *msg, size_t len, int flags);

     ssize_t
     sendto(int s, const void *msg, size_t len, int flags,
             const struct sockaddr *to, socklen_t tolen);

     ssize_t
     sendmsg(int s, const struct msghdr *msg, int flags);


解説

     send(), sendto() および sendmsg() は、メッセージを別のソケットに送信する
     のに使用されます。 send() は、ソケットが 接続された状態にあるときにだけ使
     用できるのに対し、 sendto() と sendmsg() はいつでも使用できます。

     ターゲットのアドレスを to で与え、 tolen でそのサイズを指定します。メッセ
     ージの長さは len で指定します。メッセージが長すぎて基層となるプロトコルを
     不可分に通過できない場合、エラー EMSGSIZE を返し、メッセージを送信しませ
     ん。

     send() では、配送できないことはまったく示されません。戻り値 -1 はローカル
     で検出されたエラーを示します。

     送信するメッセージを保持するスペースがソケットに無い場合 send() は通常ブ
     ロックします。ただし、ソケットが非ブロッキング入出力モードに設定されてい
     る場合は別です。 select(2) 呼び出しを使用して、さらに多くのデータをいつ送
     信できるか判定できます。

     flags パラメータには次に示されるもののうち 1 つまたは複数を含めることが可
     能です。

     #define MSG_OOB         0x1   /* 帯域外データを処理する */
     #define MSG_PEEK        0x2   /* 着信メッセージを覗く */
     #define MSG_DONTROUTE   0x4   /* ルーティングをバイパスし、
                                      インタフェースを直接使用する */
     #define MSG_EOR         0x8   /* このデータでレコードを終了する */
     #define MSG_EOF         0x100 /* このデータでトランザクションを終了する */

     フラグ MSG_OOB は、この概念をサポートするソケット (たとえば、
     SOCK_STREAM) 上の ``帯域外'' データを送信するのに使用されます。基層となっ
     ているプロトコルも ``帯域外'' データをサポートする必要があります。
     MSG_EOR は、この概念をサポートするプロトコル用のレコードマークを示すのに
     使用されます。 MSG_EOF は、ソケットの送信側のシャットダウンを要求し、指定
     データの終了時に、適切な指示の送信を要求します。このフラグは、 PF_INET プ
     ロトコルファミリの SOCK_STREAM ソケットについてだけ実装され、トランザク
     ション TCP ( ttcp(4) を参照) を実装するのに使用されます。 MSG_DONTROUTE
     は通常、診断プログラムまたは経路設定プログラムで使用されます。

     [ENOTSOCK]         引数 s がソケットではありません。

     [EFAULT]           パラメータについて無効なユーザ空間アドレスが指定されま
                        した。

     [EMSGSIZE]         ソケットはメッセージが不可分に送信されることを要求して
                        いますが、送信されるメッセージのサイズでは不可能です。

     [EAGAIN]           ソケットは非ブロッキングとマークされており、要求された
                        操作はブロックされるでしょう。

     [ENOBUFS]          システムは内部バッファを割り当てることができませんでし
                        た。バッファが利用可能になったときに操作が成功する可能
                        性があります。

     [ENOBUFS]          ネットワークインタフェース用の出力キューが満杯でした。
                        これは一般に、インタフェースが送信を停止したものの、そ
                        れが一時的な輻輳によって起こったことを示します。

     [EHOSTUNREACH]     リモートホストに到達できませんでした。

     [ECONNREFUSED]     ソケットが、ICMP 宛先不到達メッセージを、最後に送信し
                        たメッセージから受信しました。典型的には、受信者がリモ
                        ートポートで待機していないことを意味します。

     [EHOSTDOWN]        リモートホストがダウンしていました。


バグ

     sendmsg() はデータが転送されてしまうまで必ずしもブロックしないので、オー
     プンされているファイル記述子を AF_UNIX ドメインソケット ( recv(2) を参照)
     経由で送信し、それから実際に送信される前に close() する可能性があります。
     その結果、受信側は閉じたファイル記述子を得ることになります。これを防止す
     る確認メカニズムの実装はアプリケーションで行う必要があります。


関連項目

     fcntl(2), getsockopt(2), recv(2), select(2), socket(2), write(2)


歴史

     send() 関数呼び出しは 4.2BSD で登場しました。

FreeBSD 4.4                    February 15, 1995                   FreeBSD 4.4

ABELNET VPSサービス