スポンサーリンク

SEND(2) FreeBSD システムコールマニュアル SEND(2)

名称

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

ライブラリ

標準 C ライブラリ (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

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 で登場しました。

FreeBSD 10.0 February 15, 1995 FreeBSD 10.0

スポンサーリンク