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
- 名称
-
- ライブラリ
-
- 書式
-
- 解説
-
- 戻り値
-
- エラー
-
- バグ
-
- 関連項目
-
- 歴史
-
Time: 07:06:30 GMT, January 12, 2009