SEND(2) FreeBSD システムコールマニュアル SEND(2)
名称
send, sendto, sendmsg − ソケットからメッセージを送信する |
ライブラリ
標準 C ライブラリ (libc, −lc) |
書式
#include <sys/types.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] [ENOTSOCK] [EFAULT] [EMSGSIZE] [EAGAIN] [ENOBUFS] [ENOBUFS] [EHOSTUNREACH] [EISCONN] [ECONNREFUSED] [EHOSTDOWN] [ENETDOWN] [EPERM] [EPIPE] バグ |
sendmsg() はデータが転送されてしまうまで必ずしもブロックしないので、オー プンされているファイル記述子を AF_UNIX ドメインソケット (recv(2) を参照) 経由で送信し、それから実際に送信される前に close() する可能性があります。 その結果、受信側は閉じたファイル記述子を得ることになります。これを防止す る確認メカニズムの実装は、アプリケーションで行う必要があります。 |
関連項目
fcntl(2), getsockopt(2), recv(2), select(2), socket(2), write(2) |
歴史
send() 関数は 4.2BSD で登場しました。 FreeBSD 10.0 February 15, 1995 FreeBSD 10.0 |