SEND

Section: System Calls (2)
索引 jman

BSD mandoc
 

索引

名称

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

索引

ライブラリ

Lb libc  

索引

書式

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  

索引

解説

Fn send 関数および Fn sendto システムコールおよび Fn sendmsg システムコールは、メッセージを別のソケットに送信するのに使用されます。 Fn send 関数は、ソケットが 接続された 状態にあるときにだけ使用できるのに対し、 Fn sendto と Fn sendmsg はいつでも使用できます。

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

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

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

Fa 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 (ttcp4 を参照) を実装するのに使用されます。 MSG_DONTROUTE は通常、診断プログラムまたは経路設定プログラムで使用されます。

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

索引

戻り値

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

索引

エラー

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

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

 

索引

バグ

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

索引

関連項目

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

索引

歴史

Fn send 関数は BSD 4.2 で登場しました。


 

索引

Index

名称
ライブラリ
書式
解説
戻り値
エラー
バグ
関連項目
歴史

jman



Time: 07:06:30 GMT, January 12, 2009