send() - ソケットに関するデータの送信
標準
標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
XPG4.2 |
両方 |
形式
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>
ssize_t send(int socket, const void *buffer, size_t length, int flags);
#define _OE_SOCKETS
#include <sys/socket.h>
int send(int socket, char *buffer, int length, int flags);
機能説明
- パラメーター
- 説明
- socket
- ソケット記述子。
- msg
- 送信するメッセージが入っているバッファーへのポインター。
- length
- msg パラメーターで示される、メッセージの長さ。
- flags
- 複数のフラグを指定した場合には、flags パラメーターを設定し、論理 OR 演算子 (|) を使用してこれらを分離する必要があります。
- MSG_OOB
-
この概念をサポートする、ソケット上のアウト・オブ・バンドのデータを送信します。アウト・オブ・バンドのデータをサポートするのは、SOCK_STREAM ソケットのみです。アウト・オブ・バンドのデータは、単一バイトです。
アウト・オブ・バンドのデータが、2 つのプログラム間で送信される前に、いくらか調整を図る必要があります。データをインライン で読み取るつもりではない場合には、アウト・オブ・バンドのデータの受信側 は、アウト・オブ・バンドのデータの送信時に生成される SIGURG シグナル の受信側を指定する必要があります。受信側が設定されていないと、シグナルは送信されません。受信側は、fcntl コマンドの F_SETOWN オペランドを使用することにより設定されます。このコマンドは、pid または gid のどちらかを指定します。このオペランドの詳細は、fcntl コマンドを参照してください。
データの受信側は、アウト・オブ・バンドのデータをインラインで受け取るか、あるいは setsockopt() の SO_OOBINLINE オプションの設定により、インラインで受け取らないかどうかを判別します。アウト・オブ・バンドのデータの受信の詳細は、setsockopt()、 recv()、recvfrom()、および recvmsg() コマンドを参照してください。
- MSG_DONTROUTE
- この操作の間、SO_DONTROUTE オプションはオンになっています。これは通常、診断またはルーティング・プログラムだけしか使用しません。
送信するソケット・データを保留するのに使用可能な バッファー・スペースが十分でなく、ソケットがブロック・モードに なっている場合には、send() は追加の バッファー・スペースが使用可能になるまで呼び出し元をブロック します。ソケットが非ブロック・モードの場合には、send() は -1 を戻し、エラー・コードを EWOULDBLOCK に設定します。非ブロッキング・モードの設定方法の説明については、fcntl() - オープン・ファイル記述子の制御または ioctl() - 装置の制御を参照してください。
データグラム・ソケットの場合、データグラムが TCP/IP バッファーに適合すれば、この呼び出しはデータグラム全体を送信します。ストリーム・ソケットは、データを分離する境界のない情報ストリームのように動作します。例えば、アプリケーションで 1000 バイトを送信したい場合には、この関数へのそれぞれの呼び出しによって、1 バイト、または 10 バイト、あるいは 1000 バイト全体が送信できます。したがって、ストリーム・ソケットを使用するアプリケーションは、この呼び出しを ループに入れて、すべてのデータが送信されてしまうまで、この関数を呼び出す 必要があります。
C++ の特殊な動作: この関数を C++ で使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを使用する必要があります。
戻り値
正常に実行された場合、send() は、0 または送信されたバイト数を示す 0 以上の値を戻します。しかし、これはデータの送達が完了したことを 保証するわけではありません。データの送達が完了していない場合は、ピア・ソケットおよびあとで生成された SIGPIPE シグナルを使って接続を終了することができます。
- エラー・コード
- 説明
- EBADF
- socket が無効ソケット記述子です。
- ECONNRESET
- 接続はピアによって強制的にクローズされました。
- EDESTADDRREQ
- ソケットは接続目的でないため、ピア・アドレスは設定されません。
- EFAULT
- msg および length パラメーターを使用すると、呼び出し元のアドレス・スペースの外側のストレージにアクセスすることになります。
- EINTR
- データが送信される前に、シグナルが send() に割り込みました。
- EIO
- ネットワークまたはトランスポートで障害が発生しました。
- EMSGSIZE
- メッセージが大きすぎて、1 つのデータグラムとして送信されませんでした。
- ENOBUFS
- メッセージの送信にバッファー・スペースを使用することができません。
- ENOTCONN
- ソケットが接続していません。
- ENOTSOCK
- 記述子はファイル用であり、ソケット用ではありません。
- EOPNOTSUPP
- flags で設定されている値 (1 つ以上) をサポートしていない socket 引数がソケットと関連付けられています。
- EPIPE
- 接続されたストリーム・ソケットの場合には、ピア・ソケット との接続が失われています。SIGPIPE シグナルが呼び出しプロセスに送信されます。
- EWOULDBLOCK
- socket は非ブロック・モードであり、使用可能なデータ・バッファーがないか、バッファーが使用可能になる前に SO_SNDTIMEO タイムアウト値に達しました。
関連情報
- sys/socket.h — ソケット定義
- connect() - ソケットの接続
- fcntl() - オープン・ファイル記述子の制御
- getsockopt() - ソケットに関連したオプションの取得
- ioctl() - 装置の制御
- read() - ファイルまたはソケットからの読み取り
- readv() - ファイルまたはソケットのデータの読み取りとバッファー・セットへの保管
- recv() - ソケット上のデータの受信
- recvfrom() - ソケット上のメッセージの受信
- recvmsg() - ソケット上のメッセージの受信およびメッセージ・ヘッダーの配列への保管
- select()、pselect() - ファイルまたはソケットおよびメッセージ・キューに関するアクティビティーのモニター
- selectex() - ファイルまたはソケットおよびメッセージ・キューに関するアクティビティーのモニター
- sendmsg() - ソケットに関するメッセージの送信
- sendto() - ソケットに関するデータの送信
- socket() - ソケットの作成
- write() - ファイルまたはソケットへのデータの書き込み
- writev() - 配列からファイルまたはソケットへのデータの書き込み