SEND(2)

名称
send, sendto, sendmsg - ソケットからメッセージを送信する

ライブラリ
libc

書式
<sys/types.h> <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 は通常、診断プログラムまたは経路設定プログラムで使用されます。

msghdr 構造体の詳細については、 recv(2) を参照してください。

戻り値
この呼び出しは送信された文字数を返し、エラーが起きた場合は -1 を返します。

エラー
send() 関数および sendto() システムコールおよび sendmsg() システムコールは次の場合に実行に失敗します:

[EBADF]
    無効な記述子が指定されました。

[EACCES]
    宛先アドレスはブロードキャストアドレスであり、 SO_BROADCAST がソケット上に設定されていません。

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

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

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

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

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

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

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

[EISCONN]
    宛先アドレスが指定され、そしてソケットは既に接続されています。

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

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

[ENETDOWN]
    リモートネットワークがダウンしていました。

[EPERM]
    SOCK_RAW ソケットを使用しているプロセスが jail の中にあり、IP ヘッダの 中で指定されている送信元のアドレスが、その捕虜プロセスに 結び付けられている IP アドレスと一致しませんでした。

[EPIPE]
    ソケットがこれ以上データを送信できません (SBS_CANTSENDMORE がそのソケットに設定されています)。 これは通常、そのソケットが接続されていないことを意味します。

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

関連項目
fcntl(2), getsockopt(2), recv(2), select(2), socket(2), write(2)

歴史
send() 関数は 4.2BSD で登場しました。