EN JA
SEND(2)
SEND(2) FreeBSD System Calls Manual SEND(2)

名称

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

ライブラリ

Standard C Library (libc, -lc)

書式

#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  0x00001 /* 帯域外データを処理する */ 
#define MSG_DONTROUTE 0x00004 /* ルーティングをバイパスし、 
                                   インタフェースを直接使用する */ 
#define MSG_EOR  0x00008 /* このデータでレコードを終了する */ 
#define MSG_EOF  0x00100 /* このデータでトランザクションを終了する */ 
#define MSG_NOSIGNAL 0x20000 /* EOF で SIGPIPE を発生しない */

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

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

戻り値

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

エラー

send() 関数と、 sendto() と sendmsg() システムコールは、次の場合に実行に失敗します:
[ EBADF]
無効な記述子が指定されました。
[ EACCES]
宛先アドレスは、ブロードキャストアドレスであり、 SO_BROADCAST がソケット上に設定されていません。
[ ENOTSOCK]
引数 s がソケットではありません。
[ EFAULT]
引数について無効なユーザ空間アドレスが指定されました。
[ EMSGSIZE]
ソケットは、メッセージが不可分に送信されることを要求していますが、送信されるメッセージのサイズでは不可能です。
[ EAGAIN]
ソケットは、非ブロッキングとマークされており、要求された操作は、ブロックされるでしょう。
[ ENOBUFS]
システムは、内部バッファを割り当てることができませんでした。バッファが利用可能になったときに操作が成功する可能性があります。
[ ENOBUFS]
ネットワークインタフェース用の出力キューが満杯でした。これは、一般に、インタフェースが送信を停止したものの、それが一時的な輻輳によって起こったことを示します。
[ EHOSTUNREACH]
リモートホストに到達できませんでした。
[ EISCONN]
宛先アドレスが指定され、そしてソケットは、既に接続されています。
[ ECONNREFUSED]
ソケットが、ICMP 宛先不到達メッセージを、最後に送信したメッセージから受信しました。典型的には、受信者がリモートポートで待機していないことを意味します。
[ EHOSTDOWN]
リモートホストがダウンしていました。
[ ENETDOWN]
リモートネットワークがダウンしていました。
[ EADDRNOTAVAIL]
SOCK_RAW ソケットを使用しているプロセスが jail の中にあり、IP ヘッダの中で指定されている送信元のアドレスが、その捕虜プロセスに結び付けられている IP アドレスと一致しませんでした。
[ EPIPE]
ソケットがこれ以上データを送信できません ( SBS_CANTSENDMORE がそのソケットに設定されています)。これは、通常、そのソケットが接続されていないことを意味します。

歴史

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

バグ

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