日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
SEND(2) FreeBSD システムコールマニュアル SEND(2)
名称
send, sendto, sendmsg, sendmmsg -- ソケットから (複数の) メッセージを送信
する
ライブラリ
標準 C ライブラリ (libc, -lc)
書式
#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);
ssize_t
sendmmsg(int s, struct mmsghdr * restrict msgvec, size_t vlen,
int flags);
解説
send() と sendmmsg() 関数と sendto() と sendmsg() システムコールは、
(sendmmsg() 呼び出しで) 1 つ以上のメッセージを別のソケットに送信するため
に使用されます。send() 関数は、ソケットが、接続された状態であるときだけ使
用されます。関数 sendto(), sendmsg() と sendmmsg() は、ソケットがコネク
ションレス (connectionless) モードであるなら、いつでも使用されます。ソ
ケットが接続 (connection) モードであるなら、プロトコルは、(現在 tcp(4)
が、サポートがあるプロトコルのみであり) またはソケットが使用する前に接続
された状態でなければならない、暗黙の接続をサポートしなければなりません。
ターゲットのアドレスは、そのサイズか、または struct msghdr の等しい
msg_name と msg_namelen を指定している tolen で to によって与えられます。
ソケットが、接続された状態であるなら、sendto(), sendmsg() または
sendmmsg() に渡されるターゲットのアドレスは、無視されます。メッセージの長
さは、len によって与えられます。メッセージが基本的なプロトコルを通して不
可分に渡すには、長すぎるなら、エラー EMSGSIZE が、返され、メッセージは、
送信されません。
sendmmsg() 関数は、呼び出しで複数のメッセージを送信します。それらは、ベク
トルサイズを指定している vlen とともに msgvec ベクトルによって与えられま
す。各メッセージごとに送信されるオクテットの数は、転送の後にベクトルの各
処理された要素の msg_len フィールドに置かれます。
send() において、配信の失敗は、示されません。ローカルに検出されたエラー
は、-1 の返り値によって示されます。
メッセージの空間が、送信されるメッセージを保持するソケットで利用可能では
ないなら、send() は、ソケットが非ブロッキング I/O モードに置かれていない
なら、通常ブロックします。select(2) システムコールは、より多くのデータを
いつ送信することが可能であるかを決定するために使用されます。
flags 引数は、次の 1 つ以上を含みます:
#define MSG_OOB 0x00001 /* 帯域外データを処理します */
#define MSG_DONTROUTE 0x00004 /* 経路制御をバイパスし,
インタフェースを直接使用します */
#define MSG_EOR 0x00008 /* レコードを終了するデータ */
#define MSG_DONTWAIT 0x00080 /* ブロックしない */
#define MSG_EOF 0x00100 /* トランザクションを終了するデータ */
#define MSG_NOSIGNAL 0x20000 /* EOF で SIGPIPE を発生しません */
フラグ MSG_OOB は、この観念をサポートするソケット (例えば、SOCK_STREAM)
で ``out-of-band'' (帯域外) のデータを送信するために使用されます。基本的
なプロトコルは、``out-of-band'' (帯域外) のデータもサポートしなければなり
ません。そうでなければ、MSG_DONTWAIT フラグは、ブロックするとき、返る呼び
出しを要求します。MSG_EOR は、概念をサポートするプロトコルのためのレコー
ドマークを示すために使用されます。MSG_EOF は、ソケットの送信側がシャット
ダウンされることを要求し、適切な指示が指定されたデータの終わりで送信され
ることを要求します。このフラグは、PF_INET プロトコルファミリの
SOCK_STREAM ソケットのためだけに実装されています。MSG_DONTROUTE は、通
常、診断または経路制御プログラムによってのみ使用されます。MSG_NOSIGNAL
は、クローズされるソケットに書き込むとき、SIGPIPE の発生を防止するために
使用されます。
msghdr 構造体と mmsghdr 構造体の説明については、recv(2) を参照してくださ
い。
戻り値
send(), sendto() と sendmsg() 呼び出しは、送信されるオクテットの数を返し
ます。sendmmsg() 呼び出しは、送信されたメッセージの数を返します。エラーが
起こったなら、-1 の値が、返されます。
エラー
send() と sendmmsg() 関数と sendto() と sendmsg() システムコールは、次の
場合に失敗します:
[EBADF] 無効の記述子が、指定されました。
[EACCES] 宛先アドレスが、ブロードキャスト (同報通信) アドレスで
あり、SO_BROADCAST が、ソケットで設定されませんでし
た。
[ENOTCONN] ソケットが接続モードですが、接続されていません。
[ENOTSOCK] 引数 s が、ソケットではありません。
[EFAULT] 無効のユーザ空間のアドレスが、引数のために指定されまし
た。
[EMSGSIZE] ソケットが、メッセージが不可分に送信されることを必要と
し、送信されるメッセージのサイズが、これで不可能にされ
ています。
[EAGAIN] ソケットが、非ブロッキングとマークされるか、または、
MSG_DONTWAIT が、指定され、要求された操作がブロックす
るでしょう。
[ENOBUFS] システムが、内部のバッファを割り付けることができません
でした。バッファが利用可能になるとき、操作が、成功する
かもしれません。
[ENOBUFS] ネットワークインタフェースのための出力キューが、満杯で
した。これは、一般的に、インタフェースが、送信すること
を停止しますが、一時的な輻輳によって起こされることを示
します。
[EHOSTUNREACH] リモートのホストが、到達不能でした。
[EISCONN] 宛先アドレスが、指定され、ソケットが、すでに接続されて
います。
[ECONNREFUSED] ソケットが、送信された最後のメッセージから ICMP 宛先到
達不能のメッセージを受信しました。これは、通常、受信者
が、リモートのポートで listen (接続を受け付け) してい
ないことを意味します。
[EHOSTDOWN] リモートのホストが、ダウンしていました。
[ENETDOWN] リモートのネットワークが、ダウンしていました。
[EADDRNOTAVAIL] SOCK_RAW ソケットを使用しているプロセスが、jail 化され
ていて、IP ヘッダで指定された送信元アドレスが、jail と
バインドされた IP アドレスと一致しませんでした。
[EPIPE] ソケットが、これ以上データを送信することができません
(SBS_CANTSENDMORE が、ソケットに設定されています)。こ
れは、通常、ソケットが接続されていないことを意味してい
ます。
関連項目
connect(2), fcntl(2), getsockopt(2), recv(2), select(2), socket(2),
write(2), CMSG_DATA(3)
歴史
send() 関数は、4.2BSD で登場しました。sendmmsg() 関数は、FreeBSD 11.0 で
登場しました。
バグ
sendmsg() は、データが転送されるまで、必ずしもブロックしないので、AF_UNIX
ドメインソケット (recv(2) を参照) を越えてオープンされたファイル記述子を
転送することができ、次に、実際に送信される前に、それを close() (クローズ)
し受信者がクローズされたファイル記述子を取得する結果となります。これが起
こることを防止するための確認メカニズムを実装することは、アプリケーション
に委ねられています。
FreeBSD 13.2 April 27, 2020 FreeBSD 13.2